Firewall IPC requests from ServerEngine

 * ServerEngine is now seen equally by ALL clients; requesting
   clients get the ID of the work item their request got associated
   with.
 * Requests may get associated with an existing work item, rather
   than creating a new one.
 * Requesters do not get the success/failure as a response, they
   have to watch events.
 * In implementing this, created a new intermediate queue for
   work items which is used to coalesce identical commands.

Interaction attempts (confirmation) now have to deal with the
possibility that multiple requesters asked for the same work.
Due to this problem this commit DOES NOT COMPILE (and ergo also
does not test).

Next commit will address interaction attempts.

One philosophy behind this commit is that the "response serial"
was abused/overloaded in old school sbt-remote-control. This serial
should from now on be used to match a SINGLE response to each request,
and the matched response should be one that happens in finite timeframe.
Events should not match to requests and we should never send multiple
responses.
Restore interaction prompts to working

Using replyTo here was not correct in the new order
of things. Wrapped the "work ID" Long in a WorkId case
class because otherwise this refactoring would not have
broken compilation if I missed a spot. This way we can't
confuse work IDs and serials.

Now we have to pick a client at random to ask for interaction;
if only one client has requested a given task, then it will
work the same way it did before, but if multiple have we
pick one at random.

It would probably be a little better to ask for confirmation from
all requesting clients, but probably not enough better to justify
the effort. In particular we'd have to have some kind of "cancel
interaction" request to the clients who didn't reply once one
of them did reply, so obsolete dialogs would get closed.
Rename WorkId to ExecutionId

Since it is for the specific ServerEngineWork that executes
commands, rather than generically for any work.
When popping a queue it helps to remove the element
Improved error message if missing formatter from lookup table

Previously this was a "NoSuchElementException" when integration
tests failed and was a little bit hard to figure out.
Add ExecutionRequestReceived to the registry of formatters
Assert that ExecutionId is not 0
Port SimpleClient to new execution ID system.
Move ServerEngineWork queue into ServerEngine

This "proves" that it doesn't need synchronizing, so remove
the synchronization that it had. It should now always be used
from the engine thread.

To make this possible the ServerEngineQueue interface had to be
changed to have both blocking and nonblocking, and to only
return server state when ready for execution (i.e. when no more
requests). ServerEngineQueue ends up with a sort of deliberately-
inflexible and odd API; it would be more orthogonal if it just
had a separate ServerState method but this way makes it harder
to use incorrectly.
Merge remote-tracking branch 'origin/wip/model-view-server-api' into wip/havocp-unified-command-queue
Add tailrec to ServerEngine takeNextWork and pollRequests methods
Merge pull request #75 from sbt/wip/havocp-unified-command-queue

Observable command queue shared among clients