Use SOCKS5 instead of SOCKS4

A straight forward SOCKS5 server implementation with the following caveats:

 * It is tightly coupled with the obfsproxy channel/GenericNetworkProtocol code
 * It's idea of RFC1929 is the ugly hack in pt-spec.txt
 * Only supports CONNECT
 * Only supports IPv4/IPv6 addresses, because DNS leaks make me sad
Cleanups to the SOCKS5 code

 * Fixed  redundant import
 * Added some more comments
 * Deal with the possibility that socket.inet_ntop may be missing
Fix a search and replace error
Send more appropriate SOCKS error codes on connect failures
More minor cleanups

 * Log a more useful error message when user sends payload data in _SOCKS_ST_CONNECTING
 * Explicitly log a specific error when rejecting ATYP DOMAINNAME
 * Connect can also fail with TimedOutError
Add SOCKSv5Reply that can be passed to SOCKSv5Protocol.send_reply()
Derp.  IPv6 addresses are 16 bytes, and not 12.  Heh.

 * It works over the loopback address at least, still haven't gotten a tunnel.
Cleanups

 * SOCKSv5Reply changed to a newstyle class
 * Move the pluggable transport specific auth code into it's own routine, with
   lots of comments.

Thanks to isis for the help.
More changes based on feedback

 * Use a wrapper class to isolate the scary struct.pack/unpack calls
 * Refactor the code to look like twisted.protocols.socks
 * Support DOMAINNAME, though it's untested
Fix more things pointed out by asn

 * Instead of using methodcaller, just store lambdas in the auth vtable
 * Add doc strings to _ByteBuffer
 * Do not use "len" as a variable name
 * Fix a bug in processEstablishedData() that pylint caught (obfsproxy
   would never have triggered it since the routine is overriden)
Incorporate feedback from hellais, and minor bug fixes

Changed based on feedback from hellias:
 * handleCmdConnectFailure now traps errors
 * sendReply no longer deals with parsing out the outgoing local address
 * logging uses the obfsproxy logger again
 * Fixed a bug where send_reply was used instead of sendReply
 * The obfsproxy specific SOCKSv5 classes were renamed to OBFSSOCKSv5Outgoing
   and OBFSSOCKSv5Protocol

Bugs I found:
 * SOCKSv5Protocol.dataReceived() should actually work now (never called by
   obfsproxy since it's overridden)
 * _ByteBuffer.get_uint32() was always doing byte order conversion (method never
   used)
Use inet_ntop/inet_pton from twisted.python.compat instead of the socket

Apparently, these routines are missing on Windows.
Minor changes

 * Since the compat inet_ntop is used, no longer need to try/catch
 * Make _ByteBuffer.get(self, length) return a string and remove a ton of
   str() calls