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.