Reduce Circular Imports with pandas.core.reshape.concat
While working on #29124 I found a lot of general uses for this, but had to keep importing in the function body to prevent circular imports. By switching the isinstance checks to using ABC classes and moving the import of Index objects those circular imports can *mostly* be done away with

The only thing left that was causing circular imports was in the `Categorical` space. Can try to figure that out later, though cc @TomAugspurger in case that's a path that has already been gone down
pending green, LGTM > Can try to figure that out later, though cc @TomAugspurger in case that's a path that has already been gone down

I don't recall anyone trying it before. FYI not sure if anyone has seen this but here are the official Python docs on dealing with circular imports:

https://docs.python.org/3/faq/programming.html#how-can-i-have-modules-that-mutually-import-each-other

We tend to violate Guido's recommendations a lot (ex: doing `from pandas.core.base import PandasObject` instead of `import pandas.core.base as base ... base.PandasObject` but also defining class variables that aren't built ins or constant values.

Something to consider... @WillAyd can you re-push.  For some reason re-starting azure builds doesn't always take needs rebase.  the azure failure hopefully unrelated Yea still looking at this locally but trying to get a more comprehensive fix in, which could include categorical. The problem is that this module can spur a lot of imports from the index area which import from pandas.core.base which import from pandas.core.indexes ... so a lot of the circular imports I think can be traced back to that. Might have a few pre-cursor PRs to make this a full fledged change  > which could include categorical.

that would be really nice if you can pull it off > which could include categorical.

I'm looking at some related refactoring\*, wondering what you have in mind for Categorical, in particular if `.categories` would cease to be an Index.

\* Roughly, trying to get core.algorithms, core.nanops, and maybe core.missing to not depend on Index/Series etal > I'm looking at some related refactoring*, wondering what you have in mind for Categorical, in particular if `.categories` would cease to be an Index.

Nothing concrete. Categorical *might* even be a red herring and the import of ExtensionArray from `pandas.core.arrays` really be the problem, as `pandas.core.arrays` imports things like Categorical before base is fully defined

I'm looking at this off and on so if it's something you are fully interested I certainly don't mind if you are motived to take over some aspects of this Closing to clear queue; will pick back up when I get a little more free time