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.

Fixes #167 by limiting what UIContext can send
Fixes #169 (mostly) by making DynamicSerialization only deal with build values

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?