switch to using hashes from Data.Hashable

The only thing one might worry about is more probable hash
collisions (since hashable uses Int values for hashes, we only get 64
(or 32) bit hashes as opposed to the 128 bits we were getting with MD5.
I have included a comment giving some rough ballpark estimates for the
probability of collisions.  I think in practice it is not a concern,
except perhaps when building thousands of diagrams simultaneously on a
32-bit system.