[ArrayManager] REF: Implement concat with reindexing
xref https://github.com/pandas-dev/pandas/issues/39146 (the concat work item)

This PR implements `concat` for DataFrames using the ArrayManager, and all tests in `pandas/tests/reshape/` already pass. 

Summary of the changes:

* In `internals/concat.py`, I added a `concatenate_block_managers` equivalent for ArrayManagers. This function rather simply reindexes the managers and then concats the arrays (axis=0) or combines them in a single manager (axis=1).
* The main problem with that simple approach is that when reindexing the ArrayManager with the given indexer, we do not yet know the resulting dtype for when a new all-NA column needs to be added (i.e. the common dtype we would find when actually concatting). And we can't make this eg an all-NaN object array, as that would influence the `find_common_type` logic.
* The way I tried to solve this at the moment is by adding a dummy "proxy" object to signal such an all-NA array (the `NullArrayProxy` class), only tracking its length. And when actually concatting, we can replace this with an actual all-NA array after we determined the resulting dtype. This proxy object only lives inside the concatting code (it only gets created when we will call `concat_compat` and inside this function they always get replaced), so the user will never see this. 
* An alternative could be to first determine what the resulting dtype will be in `internals/concat.py` so we can pass this to the `reindex` functionality, and after reindexing do the actual concatenation. But IMO that will be more complex; the concat / find_common_type logic gets involved twice (before and after reindexing), and getting those dtypes for which we want to know the common type is also quite tricky before actually reindexing the manager. 

Basically, this replaces the 600 lines of code of `internals/concat.py` with 25 lines of `concatenate_array_managers` + the `NullArrayProxy` and `_array_from_proxy` code in `dtypes/concat.py` (but I am quite likely still missing some corner cases!)

Note: I did not explicitly test `copy=True/False` behaviour for concat along the columns with this new code.

cc @jreback @jbrockmendel 