handle DST appropriately in Timestamp.replace
```
ts = pd.Timestamp('2017-12-03 16:03:24', tz='US/Eastern')
# Timestamp('2017-12-03 16:03:24-0500', tz='US/Eastern')

ts2 = ts.replace(month=6)           # <-- across DST boundary
# master --> Timestamp('2017-06-03 16:03:24-0500', tz='US/Eastern')
# PR     --> Timestamp('2017-06-03 16:03:24-0400', tz='US/Eastern')

ts3 = ts2.tzinfo.normalize(ts2)
# master --> Timestamp('2017-06-03 18:03:24-0400', tz='US/Eastern')
# PR     --> Timestamp('2017-06-03 16:03:24-0400', tz='US/Eastern')

assert ts3 == ts2
assert ts3.hour == ts.hour
```

Both assertions fail under master, pass under this PR.

The whatsnew entry is not super-informative.  Any ideas for a one-sentence description of this fix?

- [x] closes #18319

xref #7825 (I think)
- [x] tests added / passed
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

  