ENH: pd.MultiIndex.get_loc(np.nan)
MultiIndex.get_loc could not find nan with values including missing
values as a input.

Background: In `MultiIndex`, missing value is denoted by -1 in codes and doesn't exist in `self.levels`

So, could not find NA value in `self.levels`.

Before PR xref #28783

- [x] closes #19132
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

Hello @proost! Thanks for updating this PR. We checked the lines you've touched for [PEP 8](https://www.python.org/dev/peps/pep-0008) issues, and found:







There are currently no PEP 8 issues detected in this Pull Request. Cheers! :beers: 

##### Comment last updated at 2020-01-07 13:28:41 UTC @jbrockmendel @jreback 
`get_slice_bound`, `__contains__`, `slice_indexer`, `slice_locs` changes from this change. In short, these functions can index NA value. I think, this is better than before. Because As we treat NA value like a non-NA value, we can index more accurately when NA value is in 'MultiIndex'

If,
```
idx = MultiIndex.from_arrays([[np.nan, "a", "b"], ["c", "d", "e"]])
```

case1 : "get_slice_bound" 
```
idx.get_slice_bound(np.nan, side="left", kind="ix")
Before:   raise exception
After:  0
```

case2 : "slice_indexer"
```
idx.slice_indexer(start=np.nan, end="a")   
Before: raise exception
After: slice(0, 2, None)
```

case3: "slice_locs"
```
idx.slice_locs(start=np.nan, end=("a","d"))  
Before: raise exception
After: (0,2)
```

case4: `__contains__`
```
assert np.nan in idx
Before: raise exception
After: Not raise exception
```
problem is when this PR is merged,   if `__contains__` is true, but "isin" can be false. because "isin" not affect from this change. so if this PR is merged, need to change "isin" for a consistency. 



 > problem is when this PR is merged, if __contains__ is true, but "isin" can be false. because "isin" not affect from this change. so if this PR is merged, need to change "isin" for a consistency.

can you show what you mean here? @jreback 

```
idx = MultiIndex.from_arrays([[np.nan, "a", "b"], ["c", "d", "e"]])
assert np.nan in idx
```
not raise exception. But
```
idx.isin([np.nan],level=0)
array([False, False, False])
```
`__contains__` says NA value in level 0 index, But `isin` says doesn't. 

So  If this PR is merged, change `isin` for consistency might be good.
 can you merge master and will look again > So If this PR is merged, change isin for consistency might be good.

ok this PR looks good. can you add in support for .isin() in this PR? I think it would make sense to merge these simultaneously (e.g. you can also build on this one if that is easier) @jreback 
Okay, I change `.isin` and add tests thanks @proost very nice!