clean CategoricalIndex.get_loc and improve error message
This is an offspring from #21699 to do the a cleanup in a contained PR.

``self.categories.get_loc(key)`` can never return -1, so the ``if (codes == -1): raise KeyError(key)`` is unnecessary. Instead, if key is not in self.categories, a KeyError is raised straight away.

```python
>>> ci = pd.CategoricalIndex(['a', 'b'], categories=['a', 'b', 'c'])
>>> ci.get_loc('d')
KeyError: 'd'  # both master and this PR
```

A slightly confusing issue is that if the key is found in categories, but the code is not found in self._engine, the code is shown in the KeyError message. It would probably be more intuitive that the key would be shown:

```python
>>> ci.get_loc('c')
KeyError: 2  # master, confusing IMO
KeyError: 'c'  # this PR
```

As the error type is unchanged, does this change warrant a whatsnew entry?
