BUG: list-like to_replace on Categorical.replace is ignored or crash
- [X] closes #31720
- [X] tests added / passed
- [x] passes `black pandas`
- [X] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [X] whatsnew entry

Covers the case where `to_replace` is a list-like and `value` is a string. Other cases, like "`to_replace` is dict and `value` is None", or "`to_replace` and `value` are both lists" are handled earlier in generic.py