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?

Not following here7

> 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

Why is this mutually exclusive?

Have you checked performance? IIRC I have used from_arrays instead of 

```
MultiIndex.from_tuples(result, sortorder=0, names=result_names)
```

because it was faster. Not 100% sure that this was the reason though >Not following here7

    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

Sorry, got it now. You are probably right, the levels should be empty, if the result is empty.
 > Have you checked performance? IIRC I have used from_arrays instead of [...] because it was faster. Not 100% sure that this was the reason though

If this is the case then shouldn't we want from_tuples to always dispatch to from_arrays like we currently do here?  Or is something special in this case?