Improved __repr__/__str__ for xray objects

The new `__repr__` for xray.Dataset is inspired by the representation
for iris.Cube:

    <xray.Dataset>
    Coordinates:     (time: 20, dim1: 100, dim2: 50, dim3: 10)
    Non-coordinates:
        var1              -         X          X         -
        var2              -         X          X         -
        var3              -         X          -         X
    Attributes:
        Empty

The new `__repr__` for xray.XArray and xray.DatasetArray shows the actual data
as summarized by `repr(array.data)`, as long as the data is an ndarray or
has fewer than 10^5 elements (~400 KB):

    <xray.DatasetArray 'my_variable' (time: 2, x: 3)>
    array([[1, 2, 3],
           [4, 5, 6]])
    Attributes:
        foo: bar

`__repr__` not showing the data was a complaint I heard about the prior
representation.

I removed the separate `__str__` implementation so we can have one canonical
string representation (both implementations showed equivalent information).

I am definitely open to suggestions for improving either of these!
More descriptive error message for invalid indexing
Allow Dataset.concat to take a str for concat_over

This is a simple fix for an issue that Holly encountered.
Allow for providing dimensions as xarrays to Dataset.concat

I also took the opportunity to consolidate the dimension argument handling
logic with DatasetArray.concat.
Fix check for virtual variables

It's only possible to check variable.index for 1d variables.
More flexible math with variables from different datasets

PR #33 was definitely a useful change -- item access via [] should return
items still in the context of the dataset they were pulled from.

However, it doesn't make sense to always keep track of all dataset variables.
A particular example is when doing math between variables from different
datasets.

To be more concrete, suppose I have two datasets ("obs" and "sim"), each with
two measurement variables ("tmin" and "tmax"). It should be possible to
calculate `obs['tmin'] - sim['tmin']` without a merge conflict due to
conflicting values of "tmax". Unfortunately, this is exactly what the current
version of xray reports.

This PR fixes this behavior, by automatically including only coordinates
necessary to describe the arrays involved (via `DatasetArray.select`) when
merging datasets resulting from mathematical operations.

A possible downside is that occasionally auxiliary coordinates worth keeping
around will be lost (e.g., `(2 * obs['tmin']).dataset` no longer contains a
variable "tmax"). But on the whole I think this behavior is much more in line
with reasonable expectations.

This change also removes the DatasetArray methods `refocus` and `unselected`
from the public API. I think this is the right call, since these functions
were highly specific and really only useful for the prior version of the
internal API.
Select dataset arrays before merging via dataset[key] = value

It did not really make sense that adding a dataset array to another dataset
with `Dataset.__setitem__` by default merged all dataset variables. With this
commit, set item only merges `dataset_array.select().dataset` (e.g., the array
variable itself and any coordinates). If you really want to merge in the full
dataset associated with a dataset array, there is still `Dataset.merge`, but I
expect this behavior will be less surprising.
Fix typo in XArray.in_memory
Dataset.merge ignores conflicting variable attributes

This is meant as a temporary fix until we figure out the right logic --
note the comments in the docs to this effect.
Use exact array_equal for dtype=object in xarray_equal