Implement Categorical.searchsorted(v, side, sorter)
Continued in #8972

This closes #8420, with code that supports searchsorted in Categorical, for both side='left'/'right' and with an optional sorter. The case of side='right' was tricky, as we look to the right only when matching the category name, not when matching the codes. The docstring and unit tests cover the various cases.

One thing I wasn't sure about was forcing scalar input to a Series. I copied this behaviour from Series.searchsorted to match its docstring examples. To avoid circular imports from series.py importing categorical.py, I got Series via a local import. Probably there is a better way to do this.

@SteveSimmons can you rebase and take out the print statements
 Dealt with all your comments in pull request #8928. Changing the wrapping of v from pd.Series(v).values to np.asarray(v) changed the scalar case's output from array to scalar. I decided to keep this as it matches numpy.searchsorted's behaviour. The case of scalar input is very much an edge case, anyway. What do you think is the right behaviour?
 Continued in #8972
