support MD5.clone() and SHA.clone()

This adds support for the MD5.clone() and SHA.clone() methods. In testing, it resolves the error that occurs when one of those methods gets called and then the clone gets updated with additional data; but I still see a "socket not open" error when a certain consumer tries to write to a TCP socket, which may be an issue in this code.

It already doesn't depend on the array type, but it does do a value-by-value comparison rather than a byte-by-byte comparison, so `[0x00, 0xFF] == [0x00000000, 0x000000FF]` but `[0x00, 0xFF] != [0x00FF]`.

And changing that would be complex (and perhaps less performant), because it would mean splitting multi-byte types into individual bytes. Which isn't needed for this particular use case, where the arrays in question are always of the same type.

I can definitely move it to util.js however, and have done so.