PERF: improve get_loc on unsorted, non-unique indexes
- [x] closes #19478
- [x] tests passed
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

asv run:
```
     [bd4332f4]       [9ac7be34]
-         475±5μs          422±7μs     0.89  multiindex_object.Duplicates.time_remove_unused_levels
-      15.4±0.3ms       13.5±0.2ms     0.88  multiindex_object.GetLoc.time_small_get_loc_warm
-         197±5ns          171±2ns     0.87  index_object.Datetime.time_is_dates_only
-      8.68±0.3μs       6.88±0.1μs     0.79  index_object.Float64IndexMethod.time_get_loc
-          15.4μs       12.0±0.2μs     0.78  index_object.Indexing.time_get_loc_sorted('Float')
-         283±9μs          215±2μs     0.76  multiindex_object.Values.time_datetime_level_values_sliced
-          15.0μs           11.1μs     0.74  index_object.Indexing.time_get_loc('Float')
-     7.38±0.04μs      5.03±0.05μs     0.68  index_object.Indexing.time_get_loc_sorted('Int')
-     7.15±0.04μs      4.58±0.04μs     0.64  index_object.Indexing.time_get_loc('Int')
-       121±0.9ms           1.62ms     0.01  index_object.Indexing.time_get_loc_non_unique_sorted('Float')
-           136ms           1.51ms     0.01  index_object.Indexing.time_get_loc_non_unique('Float')
-         166±1ms      1.29±0.03ms     0.01  index_object.Indexing.time_get_loc_non_unique_sorted('Int')
-       175±0.9ms      1.29±0.01ms     0.01  index_object.Indexing.time_get_loc_non_unique('Int')

SOME BENCHMARKS HAVE CHANGED SIGNIFICANTLY.
```