Object types hashing

* Hash types of values along with values themselves, e.g. distinguishing `"Null"` from `null`, `["a", "b"]` from `{"a": "b"}` (obviously, this changes the hash values of almost all objects)
* Support hashing of node.js Buffer, ArrayBuffer, typed JS objects

For details, see the individual commit messages; Again, feel free to cherry-pick any of these commits.