REF/PERF: Move MultiIndex._tuples to MultiIndex._cache
Currently, the heavy-to-calculate ``MultiIndex.values`` attribute is cached in ``MultiIndex._tuples``. It would be more dogmatic to store it in ``MultiIndex._cache`` IMO, which is what this PR does.

This has the added benefit of ``._values`` getting copied over to new copies of the MultiIndex, so also gives a performance boost in cases where copying is needed:

```python
>>> n = 100_000;
>>> df = pd.DataFrame({'a': ['a', 'b'] * int(n / 2), 'b': range(n), 'c': range(20, n + 20)})
>>> mi = pd.MultiIndex.from_frame(df)
>>> mi.values # also caches mi._values in mi._cache
array([('a', 0, 20), ('b', 1, 21), ('a', 2, 22), ...,
       ('b', 99997, 100017), ('a', 99998, 100018), ('b', 99999, 100019)],
      dtype=object)
>>> %timeit mi._shallow_copy().values
22.8 ms ± 3.43 ms per loop  # master
34.6 µs ± 997 ns per loop  # this PR
```

lgtm. can you rebase as merged your other MI PR; ping on green. Rebased. thanks @topper-123 