NaT inheritance
`pd.NaT` is an instance of `NaTType`.  `NaTType` inherits from `_NaT`, which inherits from `_Timestamp`, which inherits from `datetime`.

How would people feel about taking `_Timestamp` out of that chain?  Note that `_Timestamp` is not exported, so no users should be checking e.g. `isinstance(x, _Timestamp)`.

The motivation: if we can take `_Timestamp` out of the inheritance chain, then the entire `NaT` hierarchy along with the instance itself can be defined in its own dedicated module, with no intra-pandas dependencies other than `util`.  This comes out to a little over 500 lines.

This opens up opportunities for simplification elsewhere, since there are a _bunch_ of modules that import `NaT` but don't care about most of the rest of `tslib` (the same applies to the timezones functions in #17274).  Of particular interest are `_libs.lib`, `_libs.period`, `tseries.frequencies`, and `tseries.offsets`.

The other upside is that with few dependencies, the module becomes much easier to test/benchmark/maintain.

Without `_NaT` inheriting from `_Timestamp`, a methods in `_Timestamp` become eligible for the `@cython.final` decorator.  My (limited) understanding is that this provides a small performance improvement.

The main downside I see is that the docstring pinning done by `_make_error_func`, `_make_nat_func`, and `_make_nan_func` is a bit of a hassle. 
