TYP: Arraylike
reopening #31518 

cc @jbrockmendel @WillAyd 
makes sense from the part i understand (i.e. not Protocol)

Does it matter that MultiIndex doesnt have `._data`?  (that would be inaccurate in the status quo, not unique to this PR) > Does it matter that MultiIndex doesnt have `._data`? (that would be inaccurate in the status quo, not unique to this PR)

something we need to watch out for.   There are many occurrences of isinstance(..., MultiIndex) that would presumably be unnecessary if MutliIndex obeyed Liskov but that's another issue. At least some of the test failures look related to the exception mesages > At least some of the test failures look related to the exception mesages

don't really want to be changing these.

from https://docs.python.org/3/library/typing.html

> Changed in version 3.7: Generic no longer has a custom metaclass.

when using Generic, we get test failures on the output of `type()` when using assert, e.g. from `assert isinstance(values, PeriodArray), type(values)`

The test failures are only 3.6, so assume it is due to the metaclass.

from https://www.python.org/dev/peps/pep-0484/#instantiating-generic-classes-and-type-erasure

> Outside the class definition body, a class attribute cannot be assigned, and can only be looked up by accessing it through a class instance that does not have an instance attribute with the same name:

the errors we are getting are presumably from the way assert gets the repr from a class attribute in python 3.6