This makes the event loop handling and the threaded driver no longer dependent on a concrete implementation of the state and events being handled. This makes the handler easier to understand without wondering what is inherent to it, and what is incidental.
Additional benefits from the decoupling:
- more robust tests of event loop won't fail when the main state is broken (TODO)
- all handling for the main loop is close together now
- possible to reuse the same loop for new actors if needed