BUG: Index.difference of itself doesn't preserve type
- [x] closes #20040
- [x] tests added / passed
   - tests/indexes/test_base.py:test_difference_type
   - tests/indexes/test_base.py:test_intersection_difference
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

Uses `Index._shallow_copy([])`, which means fixes are related to getting that to work right.

Fundamental concept is that if the result of  `Index.difference` is an empty index, then result should preserve type and attributes of the object.  In addition, for `MultiIndex`, if result of intersection is an empty index, then the levels are preserved.