ENH: Add duplicated/drop_duplicates to Index

Closes #4060.

```
idx = pd.Index([1, 2, 3, 4, 1, 2])
idx.duplicated()
# Index([False, False, False, False, True, True], dtype='bool')
idx.drop_duplicates()
# Int64Index([1, 2, 3, 4], dtype='int64')

idx.duplicated(take_last=True)
# Index([True, True, False, False, False, False], dtype='bool')
idx.drop_duplicates(take_last=True)
# Int64Index([3, 4, 1, 2], dtype='int64')
```
OK, fixed to centralize the logic to ``IndexOpsMixin``. Even though ``update_inplace`` is defined in both ``IndexOpsMixin`` and ``Index``, it will never called in ``drop_duplicates`` case (``Index.drop_duplicates`` blocks ``inplace`` kw, and it is better for proper ``docstring``)