Add interface for defining an ExtensionIndex
These occur naturally with `.groupby(extensionarray)` and `Seres[extensionarray].value_counts`. We should define a public API so that we don't have to convert to object in these cases.

You'd likely end up with an `Index` with a non-object dtype.

---

*more radically* this kind of removes the *need* for all our Index subclasses, aside from MultiIndex. But we can think about that separately from the interface.

I don't think this is blocking for 1.0, but it may not be too much effort.