TYP: alias IndexLabel without Optional 
- [ ] closes #xxxx
- [ ] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

Previously in ``_typing.py`` we had the alias ``IndexLabel``, which contained ``Optional``.
The present PR eliminates ``Optional`` from the alias, but adds it in the code where necessary.

Related to the issue raised by @simonjayhawkins in https://github.com/pandas-dev/pandas/pull/36046#discussion_r485510442
Travis CI failed at miniconda build. Can anyone restart? Since `IndexLabel` can be a `Label`, and `Label = Optional[Hashable]`, isn't `Optional[IndexLabel]` the same as `IndexLabel`? lgtm. @simonjayhawkins can you address @rhshadrach question. > Since `IndexLabel` can be a `Label`, and `Label = Optional[Hashable]`, isn't `Optional[IndexLabel]` the same as `IndexLabel`?

for typing, yes. just as Union[int, float] is equivalent to float and the Optional in function signatures could be implicit. We do this for clarity and consistency.

However, the actual convention that we should eventually adopt maybe determined by the outcome of #28585 and #33025.

If we go the route of showing the aliases in the docs ( https://github.com/scikit-learn/scikit-learn/issues/16705#issuecomment-683717061 and https://github.com/numpy/numpydoc/issues/196 related), having the Optional maybe preferable. thanks @ivanovmg 