PERF: improve perf. of Categorical.searchsorted
- [ ] closes #xxxx
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

Improves performance of ``Categorical.searchsorted`` by avoiding expensive data convertions.

```python
>>> n = 100_000
>>> c = pd.Categorical(['a'] * n + ['b'] * n + ['c'] * n)
>>> %timeit c.searchsorted('b')
259 µs ± 2.95 µs per loop  # master
5.5 µs ± 165 ns per loop  # this PR
>>> %timeit c.searchsorted(['b', 'c'])
240 µs ± 4.24 µs per loop  # master
9.9 µs ± 166 ns per loop  # this PR
```

Also, ``CategoricalIndex.searchsorted`` now calls ``self.values.searchsorted`` directly instead of going through ``algorithms.searchsorted``, which always ends up calling ``self.values.searchsorted`` anyway. This ends up getting performance to 5.5 µs instead of 12 µs.

Comments addressed. thanks @topper-123 