Add ExecutionEngineEvent trait extending protocol.Event

This allows us to check via type system that ServerEngine
only sends certain events.
Split custom events out of Event hierarchy

When UIContext sends an event, it will now be contained in a
TaskEvent rather than being an event that extends Event.

Implications:

 - DynamicSerialization does not need to know about events
 - CompilationFailure and TestEvent do not extend Event
 - our ipc.Peer uses do not allow anything but Message to
   go over them
 - taskId moves out of CompilationFailure, TestEvent into
   the enclosing TaskEvent
 - UIContext only allows sending TaskEvent, not anything else
 - no need for UIContext.taskId (all contexts have fixed taskId)
 - SbtClient only allows sending Message
 - no need for JsonSink[Any]
 - no sendGenericEvent or sendRawEvent

Some possible discussion points / future improvements:

 - it's quite awkward to deserialize TaskEvent because we
   can't use unapply() because a custom unapply() on
   either TaskEvent or anything we want to stick inside
   TaskEvent will confuse play's Json.format macro.
   So to get a nice unapply() we have to hand-implement
   serialization - yuck!
 - we could strip the play JSON dependency out of UIContext
   and TaskEvent's companion object pretty trivially,
   just moving that code out a layer. Should we?