Dataset.reindex_like and DatasetArray.reindex_like

This provides an interface for re-indexing a dataset or dataset array using
the coordinates from another object. Missing values along any coordinate are
replaced by `NaN`.

This method is directly based on the pandas method `DataFrame.reindex_like`
(and the related series and panel variants). Eventually, I would like to build
upon this functionality to add a `join` method to `xray.align` with the
possible values `{'outer', 'inner', 'left', 'right'}`, just like
`DataFrame.align`.

This PR depends on PR #71, since I use its improved `copy` method for
datasets.
Refactored Dataset.reindex and generalized xray.align

The new xray.align can handle an arbitrary number of arguments, as well as
four different join options copied from `pandas.DataFrame.align` ('inner',
'outer', 'left' and 'right').

This gives us most of what we need to flip a switch and start automatically
aligning dataset arrays when they are used in mathematical operations. We'll
need to decide if we want to default to outer joins (like pandas) or inner
joins (which are less likely to blow up due to lack of memory or CPU).
Complete rebase on DatasetArray->DataArray
Dataset.from_dataframe and DataArray.from_series

Added new methods for creating Datasets and DatasetArrays from pandas objects.
Lazily decode CF datetimes and handle missing datetime values
Tweaks to handling of missing dates
Fixed typos (DatasetArray -> DataArray) in README
Merge pull request #77 from akleeman/Dataset.reindex_like

ENH: Dataset.reindex_like and DatasetArray.reindex_like
Merge pull request #80 from akleeman/from_dataframe

ENH: Dataset.from_dataframe and DatasetArray.from_series
Dataset dimensions always appear in sorted order

Prior to this patch, dimensions appeared in the order in which they were added.
This was generally fine, but it means that some output which depends on dimension
order (e.g., dataframe output) does not always appear the same, depending on
the order in which dataset variables were added. This patch now stores
dimensions internally in an unordered dict, but sorts the dimensions into
alphabetical order every time they are accessed.
Altered dimensions to use SortedKeysDict

This ensures that dimensions are always iterated over in sorted order without
imposing any overhead.
Merge pull request #83 from akleeman/unorder-dimensions

ENH: Dataset dimensions always appear in sorted order
New Dataset.__repr__

@toddsmall and @hdail both reported surprise that the order of dimensions as
printed in a Dataset's string representation are not necessarily the same as
the order of any variable dimensions.

This patch alters `Dataset.__repr__` so the order of the dimensions for each
variable is now printed. Hopefully this should make things clearer.

Example of the new look:

    <xray.Dataset>
    Dimensions:     (dim1: 100, dim2: 50, dim3: 10, time: 20)
    Coordinates:
        dim1             X
        dim2                        X
        dim3                                  X
        time                                            X
    Noncoordinates:
        var1             0          1
        var2             0          1
        var3             1                    0
    Attributes:
        Empty

Vs. the old look:

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

I added Coordinates to make it clear that these are items in the Dataset.
I removed the dashes '-' because they added visual noise that made it harder
to read the axis numbers.

Note: the commits for this PR are applied on top of those for #83, so
they can be merged sequentially without the need to rebase.
Merge pull request #88 from akleeman/dataset-repr

ENH: Better Dataset repr
Revamped Dataset update methods

New in this patch:
- Added an `update` method to override variables and attributes.
- Unified `__init__`, `__setitem__`, `update` and `merge` to call the same
  private methods/functions for processing dictionaries of variables.
- If a variable is provided as a `DataArray`, it is automatically unpacked
  into variables including all its coordinates.
- It is now possible to alter the size of existing dimensions via
  `__setitem__` or `update`.
- Removed "decode_cf" as a parameter to `Dataset.__init__`. Now this flag
  can only be used in `Dataset.load_store`.
- Generally cleaned up dataset.py.

Replaces PR #62
Merge pull request #87 from akleeman/Dataset.update

ENH: Revamped Dataset update methods
Merge pull request #91 from akleeman/lazy-decode-datetime

ENH: Lazily decode CF datetimes and handle missing datetime values
Major reorganization of backends

Changes:
- Backends are now in independent files (which should make it easier to keep
  track of them)
- netCDF4 and scipy are now optional dependencies
- added a new pydap backend (another optional dependency)
- cleaned up and sped up dataset encoding/decoding and XArray equality checks
  in the process of getting tests to pass

P.S. This is appears to be the world's most pathological netCDF file (also
available at the same URL as an OpenDAP dataset). I eventually gave up on
trying to get it to deserialize it consistently (pydap doesn't decode the
strings properly) but we might want to add it to our test suite anyways:
http://test.opendap.org/opendap/hyrax/data/nc/testfile.nc

Fun fact of the day: `np.allclose(np.int8(-128), np.int8(-128)) == False`.
Fix failing test