Timestamp replace compatibility
 - [x ] closes #15240 
 - [] tests added / passed
 - [x] passes ``git diff upstream/master | flake8 --diff``
 - [x] whatsnew entry

lgtm. ping on green. @jreback I am bit puzzled by the errors in the tests. I see issues but I think they are unrelated to my changes. Essentially, I have a) change a signature of function, b) renamed an internal variable (tzinfo) and c) adapted some internal code) but I get error about infinite recursion in some totally unrelated tests (but I may be wrong in my interpretation) @sdementen I pushed a fix to your branch. This is actually a tricky thing, ``.replace`` accepts ``None`` as an actual value for ``tzinfo``. So you need to distinguish between not passing it and passing it with a value of ``None``. The trick is to default it like ``tzinfo=object``, then check if ``tzinfo is object``, means it was not passed.

This shows up in the way it did because ``.replace`` is used a lot, for example, to reset the time zone on objects, e.g. ``Timestamp.replace(tzinfo=None)`` is common in ``dateutil`` thanks @sdementen ! Thanks to you for your support in this PR ! BTW, the replace function when used to change the time  (not the tzinfo  part), leads sometimes to inconsistent times when dst is involved in the case the replaced date cross the dst  (and so should have his offset changed). 
Is this a bug ? Or a difficult to solve limit ? Is the introduction of the fold argument a part of a future solution ?
If it is a bug not yet identified, i can add an issue
 @sdementen you would have to show an example. ``.replace`` replaces current times; however it is possible to then generate an invalid time. ``datetime.datetime`` doesn't handle this at all. ``Timestamp`` *does* to some extant. Look thru open issues and you will see a couple that are out there.