API: Make ExtensionDtype.construct_array_type a method
This allows a single dtype to support multiple array classes.
For arrow-backed strings, we'll likely want a separate array class
for ease of implementation, clarity. But we'll have a parametrized
dtype.

```python
class StringDtype:
    def __init__(self, storage="python"):
        self.storage = storage

    def construct_array_type(self):  # regular method
        if self.storage == "python":
            return StringArray
        else:
            return ArrowStringArray
```

Closes #36126