 PERF/ENH: add fast astyping for Categorical
- [x] closes #8628
- [ ] tests added / passed
- [x] benchmarks added
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

To illustrate the speed-up, the set-up is (from OP):
```python
import numpy as np
import pandas as pd

rng = np.random.default_rng()

df = pd.DataFrame(
    rng.choice(np.array(list("abcde")), 4_000_000).reshape(1_000_000, 4),
    columns=list("ABCD"),
)

for col in df.columns:
    df[col] = df[col].astype("category")
```
On master
``` python
In [5]: %timeit [df[col].astype('unicode') for col in df.columns] 
250 ms ± 601 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
```
versus on this branch
``` python
In [5]: %timeit [df[col].astype('unicode') for col in df.columns] 
5.38 ms ± 47 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
```