PERF: specialized 1D take version
A part that I took out of https://github.com/pandas-dev/pandas/pull/39692, doing it separately here. 

This gives a bit of code duplication (but all large parts of the function were already factored out into shared helper functions before, like `_take_preprocess_indexer_and_fill_value`), but having a 1D version gives less overhead compared to `take_nd`. 

Using the same benchmark case (unstack ASV case) as in https://github.com/pandas-dev/pandas/pull/39692, this gives:

```python
arrays = [np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]
index = pd.MultiIndex.from_arrays(arrays)
df = pd.DataFrame(np.random.randn(10000, 4), index=index)
df_am = df._as_manager("array")
```

```
In [3]:  %timeit df_am.unstack()
3.31 ms ± 60.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)  <-- master
2.95 ms ± 57.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)  <-- PR
```

It's a small difference (around 10% improvement), but I repeated the timings above multiple times it was quite consistently a bit faster.