REF: share wrapping in MultiIndex setops
If we can push _wrap_mi_setop_result further down into wrap_setop_result (not at all trivial bc different setops have different desired behavior on empty results) then we can share most of the rest of the MultiIndex setops code.

This PR changes the levels in the result of an empty .difference:

```
mi = pd.MultiIndex.from_product([range(3), ["a", "b"]])
mi2 = mi.repeat(2)

>>> mi.difference(mi2)
MultiIndex([], )

>>> mi.difference(mi2).levels
FrozenList([[], []])   # <-- master
FrozenList([[0, 1, 2], ['a', 'b']])   # <-- PR
```

I think this makes more sense, as a .difference should always be dtype-preserving, which for MultiIndex corresponds to levels-preserving.

In both the PR and in master, .intersection is levels-preserving when the intersection is empty, but it is less obvious to me that this is desirable.  In particular, it is mutually exclusive with .intersection being commutative.  cc @phofl?
