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
> can you follow the numpy docstring format?

Sure, although I thought I was close. What do you think stands out?

> I think we should write the docstring for the 'general' case

I was trying to state explicitly that this argument means nothing in particular for simple `Index` classes while adding a meaningful docstring for `MultiIndex.isin`, but I do understand that some might like to have it generic and in one place.

Also, is it stated somewhere that level names must be (or rather, are expected to be) strings?