Add a "stats conns" command to show the states of open connections.

This is mostly for debugging purposes, e.g., to detect hung clients,
but the implementation also simplifies management of connection
descriptors by eliminating use of the freelist and allocating a
static pointer array indexed by descriptor. (The actual conn
structures are still allocated on demand, so the impact on memory
consumption is negligible.)

To be able to show multiple concurrent UDP requests, the UDP socket
is dup()ed so that each worker thread has its own UDP file descriptor
to process rather than all sharing a single one. This means the
server can handle slightly fewer TCP clients before running up
against its file descriptor limit, but any installation that's
running that close to the limit really ought to either raise the
limit or use a proxy of some kind anyway, so this should have no
real-world downside.
Add documentation of "stats conns" to protocol.txt
Factor out string representation of conn