Serialize Short,Int,Long,Float,Double
KeyNotFound is a Response not an Event

We only use it to send a reply, not to notify out of the blue.
Merge pull request #99 from sbt/wip/havocp-key-not-found-type

KeyNotFound is a Response not an Event
Merge pull request #98 from sbt/wip/havocp-serialize-primitives

Serialize Short,Int,Long,Float,Double
rename ValueChange to ValueChanged to match BuildStructureChanged

Events in past tense, is the principle.
Remove NowListeningEvent, Stopped, NeedRebootEvent

I believe these were leftovers from requirements of the old way
sbt-remote-control worked. NeedRebootEvent never happens
anymore. NowListeningEvent and Stopped are replaced by the
onConnect / onError callbacks on SbtClient.
Merge pull request #101 from sbt/wip/havocp-drop-boot-events

Remove NowListeningEvent, Stopped, NeedRebootEvent
Merge pull request #100 from sbt/wip/havocp-rename-value-change

rename ValueChange to ValueChanged to match BuildStructureChanged
Attempt to reply exactly once to all requests

This allows requesters to block for an "ack" or ErrorResponse if they see
fit. Without the non-error ack, there's no way to know whether an error
is going to arrive later. So this is good general practice to always
have a "yes I got it" reply even if for now we never send back an
error for a particular request.
Merge pull request #104 from sbt/wip/havocp-reply-all-the-things

Attempt to reply exactly once to all requests
Fix warnings about unhandled requests

 - error on the two server-to-client requests
 - error on RegisterClientRequest after initial setup
 - make KeyLookupResponse extends Response not Request
 - delete for-now-unused KeyListRequest, we can always put it back
Remove redundant ID from completions protocol
Merge pull request #106 from sbt/wip/havocp-unhandled-requests

Fix warnings about unhandled requests
Merge pull request #107 from sbt/wip/havocp-completions-id

Remove redundant ID from completions protocol
CanLoadSimpleProject: use trySuccess not success as watch build callback

Since this callback can be run more than once, resulting in ugly backtrace
in the test logs.
Fix task ID assignment in several ways

Use Task[_] not ScopedKey. ScopedKey had multiple problems:
 - multiple tasks with same key could be in an execution
 - some tasks don't have a key

Create an ID for the registered task only, in registered(),
not for its dependencies. Previous code was assuming registered
would be called only for the destination task not every task.

Add some sanity-checks (throw exceptions if we register a duplicate
ID or try to run a task with no ID).
Make the ScopedKey in TaskStarted/TaskFinished optional

Because there are tasks with no key.
Adding a note about concurrency concerns.