BUG: Index.union cannot handle array-likes
Closes #10149.
- Added explicit tests for array-likes in set-ops, `intersection`, `union`, `difference` and `sym_diff`.
  - `TimedeltaIndex` previously did additional input check which is inconsistent with others. Made it work as the same manner as others.
  -  `MultiIndex` set-ops should only accept list-likes of tuples. Implement the logic and add explicit test.
- Changed to understandable error message for `str` which has `__iter__` in py3.

```
# current error msg
idx.intersection('aaa')
# TypeError: Index(...) must be called with a collection of some kind, 'aaa' was passed
```

NOTE: This DOESN'T care the `name` attribute checks, which is being worked in #9965.

rebase / address comments when you have a chance
 Rebased. I've added tests to `Base`, but it cannot work in all Index currently. I'll prepare separate issue about `CategoricalIndex` and `TimedeltaIndex` set ops behavior. 

What I'd like to confirm here is `MultiIndex` should accept list-likes of something? Currently, it raises error not understandable for users as below.

```
>>> midx = pd.MultiIndex.from_tuples([(1, 2), (3, 4)])
>>> midx
MultiIndex(levels=[[1, 3], [2, 4]],
           labels=[[0, 1], [0, 1]])
>>> midx.intersection([(1, 2)])
AttributeError: 'list' object has no attribute 'names'
```
 Let me update `TimedeltaIndex` behavior here (because simple than I initially thought).  On current master, `DatetimeIndex.union` performs additional check and it causes an error. Removed this check in and made it consistent with others in this PR.

```
idx1 = pd.timedelta_range('1 day', freq='D', periods=5)
idx2 = pd.timedelta_range('3 day', freq='D', periods=5)

idx1.intersection(idx2.asobject.tolist())
# TimedeltaIndex(['3 days', '4 days', '5 days'], dtype='timedelta64[ns]', freq=None)

idx1.union(idx2.asobject.tolist())
# AttributeError: 'list' object has no attribute 'inferred_type'

idx1.difference(idx2.asobject.tolist())
# TimedeltaIndex(['1 days', '2 days'], dtype='timedelta64[ns]', freq=None)

idx1.sym_diff(idx2.asobject.tolist())
# TimedeltaIndex(['1 days', '2 days', '6 days', '7 days'], dtype='timedelta64[ns]', freq=None)
```
 Rebased, and updated top descriptions about `TimedeltaIndex` and `MultiIndex` behaviors.
 thanks @sinhrks 
