Fix bug in NAryExpr where is was possible for A.Equals(B) to return
true but A.GetHashCode() == B.GetHashCode() return false.

The case of the bug was that Args.GetHashCode() was being used which
uses Object.GetHashCode() which uses references to compute GetHashCode().
This is wrong because we want hash codes to equal for structural equality.

To fix this I've implemented a really simple hashing method. I have not tested
how resilient this is to collisions.