ENH: implement EA.delete
- [ ] closes #xxxx
- [x] tests added / passed
- [x] Ensure all linting tests pass, see [here](https://pandas.pydata.org/pandas-docs/dev/development/contributing.html#code-standards) for how to run them
- [ ] whatsnew entry

Mmm @jbrockmendel what was the motivation for this change (can you just always provide that, for future readers?) In general I think we should carefully consider adding new methods, since that increases the burden on extension array maintainers to write efficient implementations.

If we are adding methods to the public API then they should be documented. This would need a docstring and it should be included in the class docstring. An arbitrary EA-backed Index will need a `delete` implementation. I assume there are calls to `np.delete` in core/indexes or core/indexing? Can those calls be rewritten to use `take`  instead of `np.delete`? There is an Index.delete method that would need to be implemented.  So de-facto we have to implement a delete method or something equivalent to it.

(np.delete wont work directly until we get `__array_function__` up and running) > There is an Index.delete method that would need to be implemented. So de-facto we have to implement a delete method or something equivalent to it.

meta-comment: this type of context is useful for evaluating PRs. Can you include motivation when creating a PR?

My preference would be to rewrite `Index.delete` to use a `take` or masked-based implementation, if it's not slower than the `np.delete` implementation. And `np.delete` seems to be implemented in Python, so I imagine we can make it equally fast.

 > if it's not slower than the np.delete implementation

Maybe there's a faster take/getitem-based imlpementation, but

```
In [3]: arr = np.arange(1000)

In [4]: %timeit np.delete(arr, 500)
4.49 µs ± 35.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [5]: %timeit mask = np.delete(np.arange(1000), 500); arr.take(mask.nonzero()[0])
13.6 µs ± 284 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [6]: %timeit mask = np.delete(np.arange(1000), 500); arr[mask]
7.83 µs ± 279 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
```