Instead of juggling events between individual instances of Core::EventLoop, move queueing and processing to a separate per-thread queue (ThreadEventQueue).