Add HashCode (de)serialization support.

The logic implemented here is derived from the `HostAndPort` (de)serialization code. As it stands, serialization produces lower case hash code strings and deserialization accepts _only_ lower case hash code strings.

Perhaps we should call `String.toLowerCase(Locale.ENGLISH)` prior to deserialization, so as to support upper and mixed cased strings. That does come with a minor performance penalty, of course. Thoughts?