We want the user to be able to use the deserialized hash just like they would the original before serialization. That's why there's type whitelisting at all, because in theory everything can be JSON-serialized, it just won't be very useful afterwards.

With string and symbol keys, we can use `#with_indifferent_access` so both ways of access work, but when the key is a number, a hash, an array or (god forbid) `true`, `false` or `nil`, reading the deserialized hash like `hash[1]` or `hash[true]` won't work.

The only key types that make sense are strings and symbols. Esoteric hashes with keys of other types should not be allowed.