CLN: refactor Series.reindex to core/generic
closes #4604, #3317, #4618

Incorrect results

```
In [1]: s = pd.Series([1,2,3,4,5], index=['a', 'b', 'c', 'd', 'e'])
In [2]: s.reindex(['a', 'g', 'c', 'f'], method='ffill')
Out[2]: 
a     1
g     5
c   NaN
f     5
dtype: float64
```

Fixed (and happens to automatically cast as well back to the original dtype)
(this was broken in 0.12)

```
In [2]: s.reindex(['a', 'g', 'c', 'f'], method='ffill')
Out[2]: 
a    1
g    1
c    3
f    3
dtype: int64
```

This does NOT automatically downcast here as this is a major
performance bottleneck if we did (this is the same result as in 0.12)

```
In [3]: >>> s.reindex(['a', 'g', 'c', 'f']).ffill()
Out[3]: 
a    1
g    1
c    3
f    3
dtype: float64
```

You can force downcasting by passing 'infer' if you want
(this option was not available in 0.12 for Series)

```
In [4]: >>> s.reindex(['a', 'g', 'c', 'f']).ffill(downcast='infer')
Out[4]: 
a    1
g    1
c    3
f    3
dtype: int64
```

TST: GH4604, reindexing with a method of 'ffill' gives incorrect results

BUG/CLN: (GH4604) Refactor Series.reindex to core/generic.py allow method= in reindexing
  on a Series to work

API/CLN: GH4604 Infer and downcast dtype if appropriate on ffill/bfill
  this is for consistency when doing: df.reindex().ffill() and df.reindex(method='ffill')

CLN: allow backfill/pad/interpolate to operate on integers (by float conversion)
     provide downcasting back to original dtype where needed core.internals.interpolate

ENH: provide core.index.identical method to compare values and attributes similar to .equals

API: changed back to pre-GH3482 where a reindex with no args will by default copy
