[PySpark] hijack hash to make hash of None consistant cross machines

In CPython, hash of None is different cross machines, it will cause wrong result during shuffle. This PR will fix this.
Add some comments to this explaining why we have our own hash function, what's special about it, etc. Also explain where the implementation below is from.