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, and #1175 for some discussion.

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.

Sorry for the issue spam, can't get the github API to work to add a PR to existing issue.