String dtype: implement object-dtype based StringArray variant with NumPy semantics
Similarly like https://github.com/pandas-dev/pandas/pull/54533 added a variant of the pyarrow-backed string dtype to use numpy nullable (NaN) semantics (now named `StringDtype(storage="pyarrow", na_value=np.nan)` with `ArrowStringArrayNumpySemantics`), this PR does the same for our object-dtype numpy array backed StringArray: a new `StringDtype(storage="python", na_value=np.nan)` with the corresponding `StringArrayNumpySemantics` array.

Illustration for discussion in https://github.com/pandas-dev/pandas/issues/57073

xref https://github.com/pandas-dev/pandas/issues/54792
This pull request is stale because it has been open for thirty days with no activity. Please [update](https://pandas.pydata.org/pandas-docs/stable/development/contributing.html#updating-your-pull-request) and respond to this comment if you're still interested in working on this. This PR is certainly not yet perfect (and further reviews are welcome!), but I am going to merge it: we still have to fix a lot of things in general anyway (all the xfailing tests with the current implementation), and by getting this in now we start addressing those xfails (e.g. https://github.com/pandas-dev/pandas/pull/59430), we can fix the tests/implementations for both dtype variants at the same time.