NumPyBackedExtensionArray
Adds a NumPyBckedExtensionArray, a thin wrapper around ndarray implementing
the EA interface.

We use this to ensure that `Series.array -> ExtensionArray`, rather than
a `Union[ndarray, ExtensionArray]`.

xref #23995 

---

cc @jreback @jorisvandenbossche @shoyer.

Some idle thoughts:

1. I'm not sure whether or not we should do this. In theory, I like the idea of `Series.array` always being an ExtensionArray. It gives us so much more freedom going forward.
2. This is probably bad, but I think unavoidable (for now)
```python
In [4]: ser = pd.Series([1, 2, 3])

In [5]: ser.array is ser.array
Out[5]: False
```
3. Should add a method for going from a NumPyBackedExtensionArray to an ndarray.
4. temporarily patching the Series /frame constructors to box all ndarrays in an ExtensionArray will be a good way to ensure that all of pandas supports EAs 
5. Should the Series / Index constructors unbox NumPyBackedExtensionArrays, so that you can't "accidentally" put one in? (I'm going to explore this quick).


TODO:

- [ ] name (NumPyBackedExtensionArray is a bit long)
- [ ] more docs
- [ ] add public API for the ndarray? Maybe `NumPyBackedExtensionArray.to_numpy()`?