PERF: Timestamp/Timedelta constructors when passed a Timestamp/Timedelta
The `Timestamp` constructor's performance could be improved when an existing `Timestamp` object is passed to it via an `isinstance`-like check:
```python
In [1]: import pandas as pd; pd.__version__
Out[1]: '0.26.0.dev0+1469.ge817ffff3'

In [2]: ts = pd.Timestamp('2020')

In [3]: def timestamp_isinstance_shortcircuit(ts): 
   ...:     if isinstance(ts, pd.Timestamp): 
   ...:         return ts 
   ...:     return pd.Timestamp(ts) 
   ...:

In [4]: %timeit pd.Timestamp(ts)
849 ns ± 13.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [5]: %timeit timestamp_isinstance_shortcircuit(ts)
121 ns ± 0.279 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
```
Some care is needed in the constructor to check if other arguments have been passed, e.g. `tz`, where we wouldn't be able to directly return the `Timestamp` object.

Similar story for the `Timedelta` constructor (should be done in a separate PR):
```python
In [6]: td = pd.Timedelta('1 day')

In [7]: def timedelta_isinstance_shortcircuit(td): 
   ...:     if isinstance(td, pd.Timedelta): 
   ...:         return td 
   ...:     return pd.Timedelta(td) 
   ...:

In [8]: %timeit pd.Timedelta(td)
800 ns ± 1.35 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [9]: %timeit timedelta_isinstance_shortcircuit(td)
120 ns ± 0.269 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
```

xref #30520