TYP: Mypy workaround for NoDefault
This uses the mypy-workaround from https://github.com/python/typeshed/pull/7127/files for `NoDefault` (works also for pyright).

`no_default` is public but `NoDefault` is luckily not public, so it should be fine to do the following:

- rename the existing `NoDefault` to `_NoDefault` (implementation and typing)
- define `NoDefault` as `NoDefault = Literal[_NoDefault.no_default]` (implementation and typing; `isinstance` checks need to be re-written to use `is no_default` but all other type annotations can stay the same)
- `no_default` "remains" `no_default = _NoDefault.no_default` (just replacing `NoDefault` with `_NoDefault`)

@simonjayhawkins @jreback @Dr-Irv 


edit:

Some context: The following will work without mypy errors afterwards:
```py
def foo(x: NoDefault | int) -> int:
    if x is no_default:
        return -1
    return x + 1
```
Something similar could also be done for `NaT` and `NaTType` >     1. There is a PEP for sentinel values:  https://peps.python.org/pep-0661/ so if that PEP is approved, maybe we should use a pattern here that makes it easy for us to switch to using that feature if it gets approved.

Once we can use this PEP (might take a long time, especially without typing_extensions), we simply need to change the two lines that define `NoDefault` and `no_default` on top of this PR (the PEP also encourages `is` for comparison, not `isinstance`). Technically, we would then need to change `no_default` when switching to this PEP which would technically break the API as it is a public symbol.

>     2. There is a lot of usage of `Literal["left", "right"]` in this PR,  so maybe we should create a type for that in `_typing.py` and use that instead.

Will do
 > Once we can use this PEP (might take a long time, especially without typing_extensions), we simply need to change the two lines that define `NoDefault` and `no_default` on top of this PR (the PEP also encourages `is` for comparison, not `isinstance`). Technically, we would then need to change `no_default` when switching to this PEP which would technically break the API as it is a public symbol.

OK, I see the path forward.  However, while `no_default` is a public symbol, we don't document what it does, so I don't think changing it to be a sentinel will break anything.  In any case, that is something that wouldn't need to be done for a few years.

 Thanks @twoertwein 