PERF: set multiindex labels with a coerced dtype (GH8456)

closes #8456 
Taking a look at this again, this operation will always copy the input array, even if it already has the right dtype.

It would be a little better to do something like this:
```
    l = len(categories)
    if l < _int8_max:
        dtype = 'int8'
    ...
    return np.array(indexer, copy=False, dtype=dtype)
```