REF: move registry, Registry to dtypes.base
These are more closely related to ExtensionDtype than to our internal EADtypes.  More concretely, they are low-dependency, while dtypes.dtypes has some unfortunate circular dependencies.

I'd also like to move pandas_dtype and is_dtype_equal from dtypes.common so that those can be stricty "above" dtypes.dtypes in the dependency structure.  Saving that for another pass.
no objections from me - @TomAugspurger thoughts? Hmm doctests failure may be related though. I see how the doctest is failing, but its not at all clear why it _isnt_ failing in master I couldn't seem to reproduce that error locally. Looks like the assertion was added back in #30619 to close a mypy issue - @simonjayhawkins any idea? > yeah i agree, let's create registry.py

hmm not sure about this, since the other two funcs im interested in (pandas_dtype and is_dtype_equal) depend on registry, so not sure where those would go.

but its a moot point until i figure out the doctest thing, which im getting nowhere on > I couldn't seem to reproduce that error locally. Looks like the assertion was added back in #30619 to close a mypy issue - @simonjayhawkins any idea?

I think the comments in #30619 explain the reasoning. Could either sort out the class hierarchy so that Liskov is obeyed (maybe add something like a _basename class attribute to access from the construct_from_string classmethod) or simply change the assert to a cast or #type: ignore for now. lgtm ping on green ping