PERF: sparse take
This helps some on #41023 because `__getitem__` uses `take` internally for `SparseArray`. However, the big gain there can follow after this to move towards not densifying on `__getitem__` with a slice

Benchmarks:
```
       before           after         ratio
     [e7e7b407]       [4de1fe27]
     <master>         <perf_sparse_take>
-        72.7±6μs         38.8±4μs     0.53  sparse.Take.time_take(array([0]), False)
-     1.00±0.06ms          350±4μs     0.35  sparse.Take.time_take(array([-1, -1, -1, ..., -1, -1, -1]), False)
-        737±20μs          206±6μs     0.28  sparse.Take.time_take(array([    0,     1,     2, ..., 99997, 99998, 99999]), False)
```
lgtm. cc @jbrockmendel  thanks @mzeitlin11 