BUG: nan-objects lookup fails with Python3.10
- [x] closes #41953
- [x] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#code-standards) for how to run them


This builds upon #41952, which should be integrated first.

We no longer can assume that the CPython's hash function for elements with NaN (float, complex, tuple) will do the right thing (see https://github.com/python/cpython/commit/a07da09ad5bd7d234ccd084a3a0933c290d1b592) and thus need to replace the default CPython's hash-function with our own, similar to the way we handle equality-operator.

We need to use old CPython hash functions for `float` and `complex`, because we would like to keep the equivalency `int(k)==float(k)==complex(k, 0.0)`.

We have more freedom with tuple's hash-function, but still use CPython's implementation, so we get old hash-values.
