Fix MD5 authentication

The original MD5toHex signature - MD5toHex(in void[][] data...) - causes
the generation of an incorrect MD5 hash.  Fixed this using a different
signature - MD5toHex(T...)(in T data).

Also, the generated MD5 hashes must use lowercase hex digits to ensure
the second hash matches the PostgreSQL hash.
Force the use of array-returning toHexString

The string-returning version of MD5toHex does extra heap allocations
so use the char[32] returning version instead.  This allows us to drop
the Order.increasing type parameter, but we need to convert the final
MD5 hash to a UTF8 string.
Allow writing of MD5 char array directly

Modify the string writing code to avoid additional heap allocations,
preferring instead to send more writes. Socket writes to the database
will usually be local, so fairly cheap, especially if Nagle's algorithm
is not disabled for the database connection.

As well as reducing Garbage Collection, reducing the number of heap
allocations reduces the copies of the written data in memory. This is
important because the passwords are sent using this call, and keeping
them in one memory location is expected to be more secure.
Use single version of sendPasswordMessage

Thanks to feedback, change back to using single sendPasswordMessage
function and tidy up the MD5 handling to be more readable.
Merge pull request #27 from jongiddy/fixmd5

Fix MD5 authentication