BUG: IntervalIndex set op bugs for empty results
- [X] closes #19101
- [X] tests added / passed
- [X] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [X] whatsnew entry

Fixed bugs described in the issue:
- Set ops that result in an empty index no longer raises.
- For empty results, the return dtype now matches the dtype of the first index.
  - Previously would always return `float64`  or `object` for empty results, depending on the op.
-  Didn't mention the raising issue in the whatsnew, since that behavior never occurred on a release, but did mention the dtype change since it occurs on 0.22.0.

Added an additional  #19016 follow-up:
 - Raise when set operation would result in a prohibited dtype:
   - Occurs when the common subtype between the two indexes is `object`.
   - Ex: `union` between `interval[int64]` and `interval[datetime64[ns]]`.
 - Behavior is generally still the same as after #19016, but improved _how_ the behavior comes about:
    - Previously the error was raised _after_ the set op data was computed, now the check occurs before.
    - Previous error message was generic, now the error message is more specific.
  
  