ENH: make `Styler` compatible with non-unique indexes
- [x] closes #41143 

The PR aims to make Styler compatible with non-unique indexes/columns, for the purpose of rendering all DataFrame types (even if no styling is applied)

- [x] `Styler.format`: made FULLY compatible with some modifications to the loops, inc TESTS.
- [x] <s>`Styler.apply` and `Styler.applymap`: made PARTIALLY compatible:
    -  if `subset`s are unique then compatible, inc TESTS.
    - if `subset`s are non-unique slices will raise a not compatible `KeyError`, inc. TESTS</s>
- [x] `Styler.apply` and `applymap` are NOT compatible. Raises KeyError.
- [x] `Styler.set_table_styles`: made FULLY compatible and will style multiple rows/columns from a non-unique key, inc TESTS.
- [x] `Styler.set_td_classes` uses `reindex` so is PARTIALLY compatible where `classes` has unique index/columns: now returns a `KeyError` in non-unique case, inc TESTS. 
- [x] `Styler.set_tooltips` uses `reindex` so is PARTIALLY compatible where `ttips` has unique index/columns: now returns a `KeyError` in non-unique case, inc TESTS. 
- [x] `Styler.hide_index` and `.hide_columns` are already FULLY compatible through existing code (inc TESTS)
- [x] all the `built-in` styling functions use some version of `apply` or `applymap` so are captured by the above cases.



I believe this is all relevant functionality reviewed.



ok!