BUG: nullable dtypes not preserved in Series.replace
- [x] closes #33484
- [x] closes #40732
- [x] closes #31644
- [x] closes #41215
- [x] closes #25438
- [x] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing_codebase.html#pre-commit) for how to run them
- [x] whatsnew entry

Sits on top of #44932

test_replace_dtype is cribbed from #37512

Improves inconsistent Categorical behavior while removing a special-case kludge for Categorical in replace_list.

Fixes an inconsistent int->float behavior introduced (intentionally, the inconsistency wasn't noticed) in #15742
lgtm. let's get a few more eyes on this.

cc @pandas-dev/pandas-core  if any comments updated with tests for some more closed issues thanks followup comments