REF: IntervalIndex dispatch more methods to IntervalArray
I think we can de-duplicate some more code by a) noticing that IntervalArray._check_closed_matches is performing the same task as DatetimeLikeArrayMixin._check_compatible_with and b) dispatching to IntervalArray methods more.

`_concat_same_dtype` could become (this could even go as the default in ExtensionIndex) 

```
def _concat_same_dtype(self, to_concat, name):
        arr = type(self._data)._concat_same_type(to_concat)
        return type(self)._simple_new(arr, name=name)
```

`insert` could look like (also could go into ExtensionIndex):

```
def insert(self, loc, item):
        new_arr = type(self._data)._from_sequence([item])
        to_concat = [self[:loc]._data, new_arr, self.loc[loc:]._data]
        res_values = type(self._data)._concat_same_type(to_concat)
        return type(self)._simple_new(res_values, name=self.name)
```

Tried this and it chokes on item=NaT.

The integer-loc case for `delete` could look like:

```
def delete(self, loc):
    if is_integer(loc):
            to_concat = [self[:loc]._data, self[loc+1:]._data]
            arr = type(self._data)._concat_same_type(to_concat)
            return type(self)._simple_new(arr, name=self.name)
```

Probably others.  Thoughts, cc @jschendel 