AbstractService: register event handlers later

This change defers event registration until the end of initialization.
This avoids a race condition whereby uninitialized services could start
receiving events. It is in general rather burdensome to code around such
a thing, since every service with event handlers must then deal with the
fact that the events can start coming in before the service is "ready".
So instead we just defer event handler registration until it *is* ready.

This change also fixes the core service implementations to call
super.initialize() as needed to ensure event handlers get registered.
ThreadService: initialize lazily

This improves the service's initialization time by deferring
construction of data structures until they are actually needed.