BUG: .loc with duplicated label may have incorrect index dtype
`.loc` result with duplicated keys may have incorred `Index` dtype.

```
import pandas as pd

ser = pd.Series([0.1, 0.2], index=pd.Index([1, 2], name='idx'))

# OK
ser.loc[[2, 2, 1]].index
# Int64Index([2, 2, 1], dtype='int64', name=u'idx')

# NG, Int64Index(dtype=object) 
ser.loc[[3, 2, 3]].index 
# Int64Index([3, 2, 3], dtype='object', name=u'idx')
ser.loc[[3, 2, 3, 'x']].index 
# Int64Index([3, 2, 3, u'x'], dtype='object', name=u'idx')

idx = pd.date_range('2011-01-01', '2011-01-02', freq='D', name='idx')
ser = pd.Series([0.1, 0.2], index=idx, name='s')

# OK
ser.loc[[pd.Timestamp('2011-01-02'), pd.Timestamp('2011-01-02'), pd.Timestamp('2011-01-01')]].index
# DatetimeIndex(['2011-01-02', '2011-01-02', '2011-01-01'], dtype='datetime64[ns]', name=u'idx', freq=None)

# NG, ValueError
ser.loc[[pd.Timestamp('2011-01-03'), pd.Timestamp('2011-01-02'), pd.Timestamp('2011-01-03')]].index
# ValueError: Inferred frequency None from passed dates does not conform to passed frequency D
```
## After the PR:

Above OK results are unchanged.

```
import pandas as pd
ser = pd.Series([0.1, 0.2], index=pd.Index([1, 2], name='idx'))

ser.loc[[3, 2, 3]].index 
# Int64Index([3, 2, 3], dtype='int64', name=u'idx')
ser.loc[[3, 2, 3, 'x']].index 
# Index([3, 2, 3, u'x'], dtype='object', name=u'idx')

idx = pd.date_range('2011-01-01', '2011-01-02', freq='D', name='idx')
ser = pd.Series([0.1, 0.2], index=idx, name='s')

ser.loc[[pd.Timestamp('2011-01-03'), pd.Timestamp('2011-01-02'), pd.Timestamp('2011-01-03')]].index
# DatetimeIndex(['2011-01-03', '2011-01-02', '2011-01-03'], dtype='datetime64[ns]', name=u'idx', freq=None)
```

Updated and now green.
 @sinhrks can you update
 @sinhrks yeh, prob requires some playing around to get this to work nicely. Like your separation of concerns though. We should document this prob at top of core/index.py
 How about adding `_infer_new` as below?
- `_infer_new`: The same as current `_shallow_copy(infer=True)`. Always tries to infer correct type.
- `_shallow_copy`: Remove `infer` kw. Always use the same type as the caller.

We can replace `_shallow_copy` by `_get_attribute_dict` + `_simple_new` completely, but I didn't do because adding `_get_attribute_dict` is redundant / easy to be missed.

If OK, I'll squash.
 @sinhrks seems reasonable call it `_shallow_copy_with_infer`? to make the connection with `_shallow_copy`
 @jreback OK, renamed. Also added general explanation about `simple_new`, `shallow_copy` and `shallow_copy_with_infer`. Could you check?
 thanks @sinhrks and nice docs!
