ENH: Add sort parameter to set operations for some Indexes and adjust…
… tests

- [ ] Progress towards #24471
- [x] tests added / passed
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

This PR makes some progress towards adding a ``sort`` parameter with a default of ``True`` to the set operations (``union``, ``intersection``, ``difference`` and ``symmetric_difference``) on ``Index`` classes. Adding this parameter into every type of ``Index`` would result in a very big PR so I have decided to break it up and try to add it in stages. I have tried to focus on ``Index``, ``MultiIndex``,  ``PeriodIndex`` and ``Intervalndex`` in this PR but have made some very small changes to set operations on other indices where necessary.

Some issues to consider:
- I'm not sure whether it will be possible to control the sorting behaviour of the results of all of the set operations for all of the ``Index`` types. For example, because of the way some of the set operations are implemented on some ``Index`` types the results may always be sorted even if ``sort=False`` is passed (e.g., a ``union`` operation on ``DatetimeIndex``s may always return a sorted result in some cases even if ``sort=False``). Perhaps this is not really a problem as long as we document it.
- There are some other corner cases that always ignore the ``sort`` parameter at the moment. For example, the ``intersection`` of an unsorted ``Index`` with itself will return the original unsorted ``Index`` even if ``sort=True`` is passed because the ``sort`` parameter is simply ignored in this case. Similarly, the ``intersection`` of an unsorted ``Index`` with an empty ``Index`` will also return the original unsorted ``Index`` even if ``sort=True``. There is similar behaviour for the other set operations.