new event system, decoupled from turbine

each event is now individually versioned, and the overall protocol
version is returned as a header. this fixes re-attaching from arbitrary
indexes; now that each event is self-contained the client will always
know its version.

the event versioning semantics are as follows:

minor bump: backwards-compatible, i.e. a field was added. the server
will always respond with the highest possible minor version, so some
fields may be present but empty if the original event is of a lower
minor version.

major bump: backwards-incompatibel, i.e. an existing field was changed
or removed. clients must handle the event differently.

this allowed for refactoring the JS side to handle versions
semantically, which dedup'd some handlers. the CLI can now also
gracefully handle these versions.

input and output events are now 2.0, as they have been restructured to
decouple from turbine's types. other events referencing turbine have
been switched to the equivalent (and backwards-compatible) ATC types.
new turbine events of version 1.0 and 1.1 are automatically translated.

the new event protocol is as follows:

1. the 'version' event is no longer sent, instead the overall protocol
version is indicated via a response header. this is not usable by JS
clients, but simplifies the response.

1. the 'event' event contains a payload of the event's data, type, and
version. this is so that the JS clients can just accept all events and
logically handle them by version and type, rather than having to
register a dozen listeners.

1. the 'end' event is emitted when the end of the event stream is
reached. this allows clients to distinguish between an interrupted
connection and a completed stream. this is the same as before, but is
now explicitly a protocol-level event rather than an actual event.

[#84527846]