String dtype: use 'str' string alias and representation for NaN-variant of the dtype
As we discussed for PDEP-14, the idea is that we would keep "string" for the NA-variant of the string dtype (for backwards compatibility), and then to have a distinguishing string representation and alias, use "str" for the default NaN-variant.

This PR updates StringDtype to make that distinction.

One point of discussion that came up while implementing this, what to do with `dtype == "string"` ? 

We have quite some places internally in the code where we use this to check for a StringDtype in general (instead of something like `isinstance(dtype, StringDtype)`). But should that exclusively return True for the NA-variants of the StringDtype? (to match the string alias/repr) 
For now I kept a special case to let this return True, but so I could also update all cases in our own code where we currently use this pattern, and change `dtype == "string"` to return False for the NaN-variant (`dtype == "str"` returns True for the NaN variant, and False for the NA variant)


xref https://github.com/pandas-dev/pandas/issues/54792
> One point of discussion that came up while implementing this, what to do with `dtype == "string"` ?

While chatting with Patrick/Brock/Will, we were thinking to for now keep this returning True also for the NaN-variants (as the current PR was doing)