Hash and equal algorithms for struct and array types

Also ban a few more types from comparisons.
I don't know the rationale. I took a look at how gc does hashing and I agree that it is a lot nicer.

I believe that gccgo can collapse identity hashes in a struct, but only if all the fields in the struct are identity hashable and contiguous.

It reminded me of C++'s std::hash which has similar problems, and a C++ committee working paper I was reading which proposed to fix some of its flaws in a way similar to how gc's hashing works (but independent of the hashing algorithm): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html