REF: avoid object-casting in _get_codes_for_values
Index.get_indexer_for ends up going through the same hashtable-based lookup anyway.  We add a little constructor overhead, but avoid object-dtype casting in cases where the common-dtype is e.g. numeric.
wow, how's performance? > how's performance?

Looks like a small improvement; i expect we could come up with cases that would go the other way:

```
import numpy as np
import pandas as pd

cats = np.arange(100)
values = np.arange(200).repeat(1000)

%timeit pd.Categorical(values, categories=cats)
911 µs ± 99.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <- master
880 µs ± 45.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <- PR

%timeit pd.Categorical(values, categories=["a", "b", "c"])
9.95 ms ± 66.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)  # <- master
8.8 ms ± 239 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)    # <- PR

objvals = np.repeat(np.array(["a", "b", "c", "d"]), 1000)

%timeit pd.Categorical(objvals, categories=["a", "b", "c"])
478 µs ± 9.43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <- master
443 µs ± 4.42 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <- PR
``` CI fail unrelated