catch complex nan in util.is_nan, de-dup+optimize libmissing, tests
gets rid of is_null_datelike_scalar, which would, among other things, treat `np.float64('-0.0')` as `iNaT`.

Some overlap with #24619, merge conflicts should be small or zero.

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