BUG-26988 implement replace for categorical blocks
- [X] closes #26988 
- [X] tests added / passed
- [X] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [X] whatsnew entry

The replace functions used in the code path that caused the bug report appeared to densify the series. This PR adds a replace function to `CategoricalBlock` that takes advantage of the categorical data type when possible