DataFrame.columns.slice_locs() is undocumented, ignores 'step' parameter or gives wrong result, `kind` parameter does nothing 
#### Code Sample, a copy-pastable example if possible

```python
df = pd.DataFrame(columns=['a','b1','c1','d1','b2','c2','d2','b3','c3','d3','e'])

# ISSUE 1: EXPECTING (2,5,8)
>>> df.columns.slice_locs(start='c1',end='c3', step=3, kind='ix')
(2, 9)
>>> df.columns.slice_locs(start='c1',end='c3', step=3, kind='loc')
(2, 9)
>>> df.columns.slice_locs(start='c1',end='c3', step=3, kind='getitem')
(2, 9)

# ISSUE 2: we supply a nonsensical 'step', get different wrong behavior
>>> df.columns.slice_locs(start='c1',end='c3', step=pd.np.nan)
(2, 7)

```
#### Problem description

1. `DataFrame.columns.slice_locs` ignores its 'step' argument and gives the wrong answer for any positive integer step. In above example we expect the specific slice `(2,5,8)` but only get the slice `(2,9)` (with the 'end' arg being off-by-one, for `.iloc[:, ...]` I suppose). b) Why do we have to manually specify the step arg anyway, it can and should be computed? If anything it should only be a hint for efficiency, not a required option. c) For step=negative or NaN we now get the wrong `(2,7)` instead of `(2,5,8)`
1. `DataFrame.columns.slice_locs` `kind` argument is totally underdocumented, just seems to be totally ignored. b) I can't understand what the 'getitem' setting is supposed to mean. If it's not needed or used, please remove it. Else please document what it's supposed to do. c) Also, since 'ix' method was deprecated, best to rename that value 'iloc'.
1. The entire `DataFrame.columns.slice_locs` function is severely underdocumented (also it's hardly mentioned anywhere in the doc and not at all in "10 Minutes to pandas"; I've been using pandas for 10 years but only just discovered it, totally by chance).
1. As a separate enhance req, `DataFrame.columns.slice_locs` could seriously do with a regex option, e.g. above would be `df.columns.slice_locs(regex='^c[0-9]')`. Let me know if you want me to raise a separate enhance req. I think it would be really neat. Here's my workaround: `tuple(df.columns.get_loc(col) for col in df.columns if re.match('^c[1-7]', col))` gives `(2,5,8)`. If you don't use `tuple` you get a generator object, which seems unwanted.

#### Expected Output

(2,5,8)

#### Output of ``pd.show_versions()``

<details>
INSTALLED VERSIONS
------------------
commit: None
python: 3.7.1.final.0
python-bits: 64
OS: Darwin
OS-release: 17.7.0
machine: x86_64
processor: i386
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8

pandas: 0.23.4
pytest: 3.8.0
pip: 19.1.1
setuptools: 40.2.0
Cython: 0.28.5
numpy: 1.16.2
scipy: 1.2.1
pyarrow: None
xarray: None
IPython: 6.5.0
sphinx: 1.7.9
patsy: 0.5.0
dateutil: 2.7.3
pytz: 2018.5
blosc: None
bottleneck: 1.2.1
tables: 3.4.4
numexpr: 2.6.8
feather: None
matplotlib: 2.2.3
openpyxl: 2.5.6
xlrd: 1.0.0
xlwt: 1.3.0
xlsxwriter: 1.1.0
lxml: 4.2.5
bs4: 4.5.3
html5lib: 1.0.1
sqlalchemy: 1.2.11
pymysql: None
psycopg2: None
jinja2: 2.10
s3fs: None
fastparquet: None
pandas_gbq: None
pandas_datareader: None
</details>