PERF: enhance MultiIndex.remove_unused_levels when no levels are unused
- [x] closes #19289
- [x] tests passed
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

This uses ``np.bincount`` rather than ``algos.unique`` to check _if_ there are unused levels: since levels indexes are adjacent integers, the former is faster (~50% in my tests). It then fallbacks to ``algos.unique`` if there are unused levels.

The result is that asv tests on ``--bench reshape`` give
```
       before           after         ratio
     [d5d5a718]       [499ae6bf]
-     1.43±0.01ms      1.19±0.01ms     0.83  reshape.SparseIndex.time_unstack
```

There is a penalty (of the same order of magnitude) for cases in which _there are_ unused levels, but I think this is worth because:
- there is room for cythonizing and bringing this penalty close to zero in the average case (see comment in code)
- I think the case of no unused level is much more frequent
- if people want to avoid this penalty they can just clean their index from unused levels once for all
- in any case, asv tests on ``--bench multiindex_object`` (where the index in ``Duplicates`` always has unused levels) do not find any change in performance