Sync execution queue AND active execution for new clients

This PR includes #161 and #162 so merging those first will shrink this one.

This moves eventListeners out of ServerState because we need to atomically modify the listener list and send the sync-up events, which wasn't possible the way the code was structured before.

The PR also has an overhaul of how we use Format, changing it to Writes, sometimes putting an upper bound on writeable types (for e.g. the logSink which now can only accept LogEvent), and actually using the passed-in Writes instead of a hardcoded one.

The main user-visible improvement here is that now when clients connect they are brought up to speed.

this is now done; "custom" messages from tasks are wrapped in TaskEvent