Support hard-masked numpy arrays
- [x] closes #24574
- [x] tests added / passed
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

For the whatsnew entry, is this reasonable?
```rst
- :func:`DataFrame` and :func:`Series` now properly handle 
numpy masked arrays with hardened masks. Previously, constructing 
a DataFrame or Series from a masked array with a hard mask would 
create a pandas object containing the underlying value, rather than the
expected NaN. (:issue:`24574`)
```