PERF: Improve replace perf
- [x] tests added / passed
- [x] passes `git diff upstream/master | flake8 --diff`
- [x] whatsnew entry

When `.replace` is called with `dict`, replacements are done per value. Current impl try to soft convert the dtype in every replacement, but it is enough to be done in the final replacement.
#### Bench

```
-  712.83ms   355.93ms      0.50  replace.replace_convert.time_replace_series_timestamp
-     1.50s   698.21ms      0.46  replace.replace_convert.time_replace_frame_timestamp
-     3.12s   690.48ms      0.22  replace.replace_convert.time_replace_frame_timedelta
-     1.69s   354.83ms      0.21  replace.replace_convert.time_replace_series_timedelta
```

notice that `BoolBlock.replace` doesn't have `convert` arg at all! so not tested / working. can you give a check.
 Ah, found some `.replace()` conversion looks buggy. I'll submit a separate issue as the fix not looks straightforward.
 See #12747. Change this PR title to WIP until #12747 is fixed.
 ## [Current coverage](https://codecov.io/gh/pandas-dev/pandas/pull/12745?src=pr) is 85.27% (diff: 90.00%)
> Merging [#12745](https://codecov.io/gh/pandas-dev/pandas/pull/12745?src=pr) into [master](https://codecov.io/gh/pandas-dev/pandas/branch/master?src=pr) will decrease coverage by **<.01%**

```diff
@@             master     #12745   diff @@
==========================================
  Files           144        144          
  Lines         50915      50921     +6   
  Methods           0          0          
  Messages          0          0          
  Branches          0          0          
==========================================
+ Hits          43419      43423     +4   
- Misses         7496       7498     +2   
  Partials          0          0          
```

> Powered by [Codecov](https://codecov.io?src=pr). Last update [dfeae39...ffc59b0](https://codecov.io/gh/pandas-dev/pandas/compare/dfeae396c832358e0a2f64e67bd48ca83a9c4976...ffc59b04d2328e3bf7059bec615f99e8dcfbf8a4?src=pr) can you rebase / update?
 lgtm. can we merge this independent of the other PR's? (so it could go in 0.19.2) It is independent. #12780 fixes some existing bugs separately. thanks!