have _NaT subclass datetime directly
The main change made by this PR is to have `_NaT` subclass `datetime` directly instead of subclassing `_Timestamp`.  Everything else is just to preserve the current behavior.

Why you ask?  Because once this is OKed, the entire `NaT` machinery can be cut/paste into a stand-alone module whose only intra-pandas dependency is `util`.

The only non-trivial behavior is in `__add__` and `__sub__`, where currently `_NaT` dispatches to `_Timestamp` for a few cases.  This PR re-implements those cases directly in `_NaT`.  While that does mean a small amount of repetition, it opens up the possibility of using `@cython.final` for potential optimization in `_Timestamp.__add__/__sub__`.

`NaTType.to_datetime` could use `_make_nat_func` if we were OK with it not producing the same warning as `Timestamp.to_datetime`.

- [ ] closes #17435
- [ ] tests added / passed
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry
