API - consistent return types from all inconsistent index setops
#### Code Sample, a copy-pastable example if possible

```python
import pandas.util.testing as tm
tm.makeFloatIndex().difference(tm.makeStringIndex())  # returns dtype(float), should possibly be dtype(O)
tm.makeFloatIndex().symmetric_difference(tm.makeIntIndex())  # returns dtype(float), should possibly be dtype(O)
pd.Float64Index([1,2,3]).intersection(pd.Int64Index([1,2,3]))  # returns dtype(float), should possibly be dtype(O)

```
#### Problem description
With this PR (https://github.com/pandas-dev/pandas/pull/23538), all union operations between inconsistent index types will return a standard index dtype of object. Perhaps this should hold true for all setops. The biggest violator of this currently would be difference, which just returns the left hand index. Intersection and symmetric difference handle this fine for the most part, however there are some cases where they do not respect this, for example `FloatIndex.difference(IntIndex)`.

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

0.25.0.dev0
