Simplify to_pydatetime()
Up until #17331, `Timestamp.microsecond` was very slow.  So previously it was faster to go through `convert_to_tsobject` to get a new `datetime` instance than it was to just return 
 `datetime(self.year, self.month, self.day, self.hour, self.minute, self.second, self.microsecond, self.tzinfo)`

Now it is slightly faster (and much simpler) to do it this way.

Before:

```
In [2]: ts = pd.Timestamp.now()
In [3]: %timeit ts.to_pydatetime()
The slowest run took 13.88 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.44 µs per loop
```

After:
```
In [2]: ts = pd.Timestamp.now()
In [3]: %timeit ts.to_pydatetime()
The slowest run took 8.51 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.29 µs per loop
```

With a tz-aware Timestamp the speedup is much bigger:

Before:
```
In [4]: import pytz
In [5]: ts2 = ts.replace(tzinfo=pytz.timezone('US/Pacific'))
In [6]: %timeit ts2.to_pydatetime()
The slowest run took 39.71 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 68.9 µs per loop
```

After:
```
In [7]: import pytz
In [8]: ts2 = ts.replace(tzinfo=pytz.timezone('US/Pacific'))
In [9]: %timeit ts2.to_pydatetime()
The slowest run took 8.29 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.47 µs per loop
```
