Sparse Frame ops - can we just use align?
Working on de-specializing the SparseDataFrame implementations of a few methods, some of the alignment logic looks like it may be unnecessarily verbose, but I'd like a second opinion (and a first well-informed opinion)

The relevant lines from the DataFrame methods:
```
def _combine_match_columns(self, other, func, level=None, try_cast=True):
        left, right = self.align(other, join='outer', axis=1, level=level,
                                 copy=False)
       [...]

    def _combine_match_index(self, other, func, level=None):
        left, right = self.align(other, join='outer', axis=0, level=level,
                                 copy=False)
       [...]
```

And the analogous SparseDataFrame methods:

``` 
    def _combine_match_columns(self, other, func, level=None, try_cast=True):
        union = intersection = self.columns
        if not union.equals(other.index):
            union = other.index.union(self.columns)
            intersection = other.index.intersection(self.columns)
       [...]

    def _combine_match_index(self, other, func, level=None):
        new_index = self.index.union(other.index)
        this = self
        if self.index is not new_index:
            this = self.reindex(new_index)

        if other.index is not new_index:
            other = other.reindex(new_index)
       [...]
```

Can the `self.align` calls (or something similar) be used by the non-sparse methods be used in the sparse cases?