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?

It is the exact formatting that is important for the correct rendering (see https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt). It should be formatted as:
```
arg : type
    Explanation
```
(so no blank line, and the explanation should be indented)

> > 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.

The docstring in MultiIndex.isin should also be meaningful. But it is just that in the online documentation, there are references to Index.isin, so I think the all relevant information should also be there (to not have to link to both Index.isin and MultiIndex.isin)

> Also, is it stated somewhere that level names must be (or rather, are expected to be) strings?

Ah, no, it can be any object I think, but int and string will be the normal ones?