API: add 'level' kwarg to 'Index.isin' method

closes #7890

This PR adds `level` kwarg for `Index` objects as discussed (briefly in #7890):

```python

Index.isin(iterable, level=None)
```

### Summary
- for non-`MultiIndex` classes:
  - no functional changes in the actual membership test
  - valid `level` values are `None`, `0`, `-1` and `self.name`
  - if `level` doesn't match the name, it's a `KeyError` (was `AssertionError` before)
- for `MultiIndex` classes:
  - if `level=None`, elements of `self.values` (tuples) are used
  - otherwise elements of corresponding level are used
  - valid `level` values are the same as in `MultiIndex.get_level_values` method, `-self.nlevels..(self.nlevels - 1)` plus all unique index names

### TODO
- [ ] add to documentation
- [x] optimize MultiIndex case
two remarks:
- can you follow the numpy docstring format?
- I think we should write the docstring for the 'general' case (so it is also applicable for MultiIndex), as this is the docstring that will be rendered in the html docs.

So roughly something like:
```
level : int, string, default None
    Level number or name to specify the index level to use if the index is a MultiIndex.
```