PERF: Introducing hash tables for complex64 and complex128
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

Next step for #33287

The complex case is somewhat less straight forward, because Cython [defines](https://github.com/cython/cython/blob/master/Cython/Includes/numpy/__init__.pxd#L755) `complex128`/`complex64` as:

```
ctypedef float complex  complex64_t
ctypedef double complex complex128_t
```

where `double complex` actually means a Cython-datatype defined here https://github.com/cython/cython/blob/master/Cython/Utility/Complex.c#L56

Thus a conversion between numpy's complex and Cython's complex must happens somewhere.



