I don't exactly know why I decided to make ListenerHandler as a custom struct. It doesn't make sense and I think it should be an uint64_t for the sake of simplicity.
(maybe some time ago I probably wanted a RAII "token" that would remove the listener automatically)