Fix HashDict so that key comparison uses exact match

This change means that a HashDict is nolonger ordered. Previously
HashDicts did some ordering and for small sizes were fully ordered.
However this meant that keys which compared equal (==) but not exactly
equal (===) would be considered different for large sizes but
equivalent for small sizes. This ambiguity occured because hashes are
only equal when terms are exactly equal (===).

See github issue #1171 for examples.

Note: If assumptions were made about the form of a HashDict they may
nolonger be valid. Particularly that HashDicts can nolonger be reliably
pattern matched on for equality.