REF: Dispatch string methods to ExtensionArray
This is a large refactor of our string methods. The goal is to have the `Series.str` accessor dispatch the actual compute down to the ExtensionArray. The motivation is to allow a Series backed by Arrow memory to use the Arrow string kernel (e.g. `Series.str.lower()` on an Arrow-backed StringArray should eventually call `pyarrow.compute.utf8_lower()`.)

To facilitate this, I made the following changes

1. Split `core/strings.py` into a sub package:
  - `core/strings/accessor.py`: Implements the `Series.str` accessor, which (mostly) just delegates to the EA and wraps
  - `core/strings/object_array.py`: Implements the string methods for object-type ndarray. 
  - `core/strings/categorical.py`, `core/strings/string_array.py`, implements categorical & StringArray-specific methods
2. Defines a new `ExtensionArray._str` extension point. This is where EAs get to take over and use their compute

Note that there are a few methods like `cat`, `extract`, and `extractall` that don't yet dispatch. I need to look into them a bit more, there implementation is a bit confusing.

Closes https://github.com/pandas-dev/pandas/issues/36216