tracker: client fairness, backpressure, and expiry
Make client query processing less aggressive and more fair by
only enqueueing a single worker request at a time. Pipelined
requests in the read buffer will only be handled after
successful writes, and any incomplete writes will block further
request processing.
Furthermore, add a watchdog for clients we're writing to
expire clients which are not reading our responses.
Danga::Socket allows clients to use an infinite amount of
space for buffering, and it's possible for dead sockets
to go undetected for hours by the OS.
Use a watchdog to kick out any sockets which have made no
forward progress after two minutes.