String dtype: map builtin str alias to StringDtype
This ensures that the builtin type `str` is also mapped to the future default string dtype (if `infer_string` is enabled), i.e. to make `.astype(str)` behave the same as `.astype('str")`.

In general we rely on numpy for mapping builtin types to dtypes. For example `int` is mapped to `np.dtype("int64")` by passing that value to `np.dtype(..)` in `pandas_dtype()`. 
But now that we have a default dtype that is mapped to one of those builtin types, we can no longer rely on numpy doing that. Implementation wise, for `pandas_dtype(str)` I currently added a special case checking explicitly for `str` and then importing the dtype lazily and returning it. 

An alternative could be to handle this through the ExtensionDtype `Registry.find()`. However, that currently relies on using `ExtensionDtype.construct_from_string()` (i.e. we would have to expand the typing there to allow type objects as well next to strings, which is of course also possible). And maybe it is better to have control centrally about builtin aliases, instead of allowing external dtypes to map to those as well.

xref https://github.com/pandas-dev/pandas/issues/54792/
Thanks @jorisvandenbossche 