Implement Arrow String Array that is compatible with NumPy semantics
cc @jbrockmendel @jorisvandenbossche 

I'll do a couple of pre-cursors to reduce the diff

Context: https://github.com/pandas-dev/pandas/issues/54792
You will also need to update the na_value use for the dtype:

```diff
--- a/pandas/core/arrays/string_.py
+++ b/pandas/core/arrays/string_.py
@@ -101,7 +101,10 @@ class StringDtype(StorageExtensionDtype):
     #: StringDtype().na_value uses pandas.NA
     @property
     def na_value(self) -> libmissing.NAType:
-        return libmissing.NA
+        if self.storage == "pyarrow_numpy":
+            return np.nan
+        else:
+            return libmissing.NA
```

That eg ensures that getitem returns a NaN instead of pd.NA Flying today, will look tomorrow/thursday @jorisvandenbossche would you be ok with doing this as a follow up? I tested this on my train ride but it broke a bunch of tests (obviously), which would make review even more complicated See #54585 for the na value Something that also still needs to be done (for this topic, not necessarily in this PR) is to ensure that the constructors and IO methods that follow `pd.options.future.infer_string` now use this pyarrow_numpy dtype instead of the plain pyarrow one? Yep this will be simple, but needs tear adjustments so easier as a follow up.

the actual logic is in 2 methods, so code adjustments will be minimal  cc @jbrockmendel this should be ready behaviour wise now @jbrockmendel @jorisvandenbossche are we good to merge here? Yes, let's merge this. You have some follow-up PRs in the line anyway, so any further comment can be addressed in those, I think.

(and I'll open some issues for some of the comments I made) @MeeseeksDev backport to 2.1.x I'll put up a pr for the infer option and the whatsnew later today Opened https://github.com/pandas-dev/pandas/issues/54792 as a general follow-up issue tracking the new string dtype topic. And will open some other issues for a few of the remaining discussion items above.