ENH: allow index to be referenced by name
- [x] closes #8162 and #10816
- [x] tests added
- [x] tests passed
- [x] passes `git diff upstream/master | flake8 --diff`
- [x] whatsnew entry

Still missing are groupby support (#5677) and `.loc` support.

Also, I wasn't sure if this deserves more than just a line in whatsnew, so I kept it small for now.

With a standard index:

```
idx = pd.Index(list('abc'), name='idx')

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=idx)

df['idx']
Out[4]: 
idx
a    a
b    b
c    c
Name: idx, dtype: object

df.idx
Out[5]: 
idx
a    a
b    b
c    c
Name: idx, dtype: object

df[['idx', 'B']]
Out[6]: 
    idx  B
idx       
a     a  4
b     b  5
c     c  6
```

and with a MultiIndex:

```
idx = pd.MultiIndex.from_product([list('abc'), list('fg')], names=['lev0', 'lev1'])

df = pd.DataFrame({'A': range(6), 'B': range(10, 16)}, index=idx)

df['lev0']
Out[9]: 
lev0  lev1
a     f       a
      g       a
b     f       b
      g       b
c     f       c
      g       c
Name: lev0, dtype: object

df.lev0
Out[10]: 
lev0  lev1
a     f       a
      g       a
b     f       b
      g       b
c     f       c
      g       c
Name: lev0, dtype: object

df[['A', 'lev1']]
Out[11]: 
           A lev1
lev0 lev1        
a    f     0    f
     g     1    g
b    f     2    f
     g     3    g
c    f     4    f
     g     5    g
```
