Authentication, Keep Alive, Misc. Fixes/Updates

Fixed a SIGSEGV bug in the connection manager that would occur if the
server was shutdown while clients were connected (the asynchronous
callback function was relying on callbacks stored in the connection
manager and which died with the connection manager, so when the server
killed the connection manager, which could happen before the
asynchronous callback fired, the asynchronous callbacks were suddenly
reaching out into invalid memory.  Solution: Copy the callbacks into the
asynchronous function).

Did some more function parameter/rvalue normalization.

Added numerous capabilities to the Client object.  It now has quite a
bit of send/receive synchronization, which allows encryption to be
enabled atomically with a send (necessary for a safe, reliable, and
consistent implementation of the Minecraft encryption handshake without
race conditions).  It now also automatically keeps track of client
inactivity time, measured by the time since either some piece of code
manually reset the time, or since the last packet was completely
received.  It now tracks/exposes the client's username.  It now has
wrapper functions which allow the client's IP and port to be retrieved.

Updated the values of the ClientState enumeration to reflect the
realities of the way that mod/server core responsibilities are split up.
May replace this with a boolean value at some point, but the enumeration
paradigm will scale more gracefully, so I'm torn.

Added the ability to enumerate all connected clients to the ClientList
object.

Added "ProtocolAnalysis" to the Server object, which allows protocol
analysis to be turned on, which is a flag that tells the server's
components, and mods (if they check it) to output verbose debug
information.  The Client object implements this functionality, dumping
parses of incoming/outgoing packets to the log if this is set to true.
Added support functionality to the Packet object, which allows arbitrary
packets to be parsed into string representations.

Fixed a bug in the URL encoder that was causing digits to be percent
encoded.

Added a threadsafe random number generator template, which allows
arbitrarily-sized integers within arbitrary bounds to be generated.
Also added a wrapper for the OpenSSL cryptographically secure PRNG,
which is used to seed this random number generator template.  May add a
templated wrapper to the OpenSSL PRNG as well so arbitrarily-sized
integers can be pulled out of it without type-punning shenanigans, but
that's not in this commit.

Added Minecraft authentication/protocol encryption support.  See
auth/main.cpp.  Discovered a few odd things about the Minecraft
client/protocol in the process.  This has been added to the MCDevs wiki
at wiki.vg.

Added keep alive support.  The server will send out keep alive (0x00)
packets every ~5 seconds with a random ID.  The server ignores all
received keep alives from the client, but received keep alives do
automatically reset the client's inactive time, so they serve their
purpose.

Fixed a possible memory leak in the SHA1 implementation that would occur
if copying the message digest context failed.