PERF/REF: MultiIndex.copy
Makes ``MultiIndex.copy`` call ``MultiIndex._shallow_copy`` rather than the other way around. This is cleaner and let's us copy the existing  ``.cache``, so may give performance boost when operating on copied MultiIndexes:

```python
>>> n = 100_000
>>> df = pd.DataFrame({'a': range(n), 'b': range(1, n+1)})
>>> mi = pd.MultiIndex.from_frame(df)
>>> mi.get_loc(mi[0])  # also sets up the cache
>>> %timeit mi.copy().get_loc(mi[0])
8.57 ms ± 157 µs per loop  # master
57.9 µs ± 798 ns per loop  # this PR
```

Also cleans kwargs from the ``MultiIndex._shallow_copy`` signature. This PR is somewhat related to #32669.

thanks. 