ENH: preserve RangeIndex in factorize
- [ ] closes #xxxx
- [x] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

minor comment, any perf implications? > any perf implications?

```
In [2]: ri = pd.Index(range(10**5))

In [3]: %timeit ri.factorize()
2.28 ms ± 120 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)   # <-- master
33.2 µs ± 199 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)  # <-- PR

In [5]: %timeit mi = pd.MultiIndex.from_arrays([ri, ri, ri])
18.2 ms ± 1.26 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)  # <-- master
308 µs ± 5.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <-- PR

In [6]: mi = pd.MultiIndex.from_arrays([ri, ri, ri])

In [7]: %timeit mi.get_loc((10, 10, 10))
13.1 µs ± 65.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)  # <-- master
11 µs ± 116 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)  # <-- PR
```
 > > any perf implications?
> 
> ```
> In [2]: ri = pd.Index(range(10**5))
> 
> In [3]: %timeit ri.factorize()
> 2.28 ms ± 120 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)   # <-- master
> 33.2 µs ± 199 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)  # <-- PR
> 
> In [5]: %timeit mi = pd.MultiIndex.from_arrays([ri, ri, ri])
> 18.2 ms ± 1.26 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)  # <-- master
> 308 µs ± 5.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)  # <-- PR
> 
> In [6]: mi = pd.MultiIndex.from_arrays([ri, ri, ri])
> 
> In [7]: %timeit mi.get_loc((10, 10, 10))
> 13.1 µs ± 65.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)  # <-- master
> 11 µs ± 116 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)  # <-- PR
> ```

nice ok, imagine these progate to other things in a + way. rebased+green