API: make CachedAccessor public in addition to register_dataframe_accessor
In GeoPandas we added a `plot` accessor similar to the pandas one (so you can still access all the pandas plotting kinds, also from a GeoDataFrame where the default plot is a spatial map), see https://github.com/geopandas/geopandas/pull/1465.

But, in that PR, we made use of `pandas.core.accessor.CachedAccessor`, which is how we add accessors in pandas under the hood:

https://github.com/pandas-dev/pandas/blob/ffa6e20d7dadd262d9035a647dffed9903fc5929/pandas/core/frame.py#L9730-L9731

So in GeoPandas we basically copied the above code, but with our adapted GeoPlotAccessor.

The reason that we can't use the public way to add accessors with `pd.api.extensions.register_dataframe_accessor` is that we are overriding an existing accessor of pandas (intentionally). 

So can we consider `CachedAccessor` to be "public"-like so it is fine for GeoPandas to use it? Or do we want to explicitly expose the class in the `pandas.api.extensions` namespace? Or can we change `register_dataframe_accessor` to allow it to override existing methods? (not sure we want to make that too easy)