ENH: allow storing ExtensionArrays in the Index
I started experimenting with allowing EAs to be used in the Index (so we can put nullable int/bool, string dtype etc in the Index).

My approach is to use the base `Index` class for this (and not a custom subclass):

- We use a similar approach for Series, which can also hold either ndarray or EA as underlying values
- I don't think we want to start adding subclasses for all new EAs (like Int64Index for the new Int64Dtype is not quite possible ..)
- This also works for external EAs

For now, it just integrates it, so an EA can be put in an index and tested operations work. This PR does *not* (yet) handle ensuring that operations relying on the index' Engine are efficient (currently it simply uses `np.asarray(EA)` as the engine values, which eg will be object dtype for Int64Dtype)

cc @jbrockmendel @TomAugspurger @jreback 