Release notes
- Added `obsoper.Operator` to allow the user to select `regular`, `regional` or `tripolar` grids with or without a halo.
- This new interface requires users to specify observation locations up front which allows the operator
to precalculate the weights of it's interpolation procedure
- The down side is the constructor now requires a minimum of 4 arguments
- Added `obsoper.domain` module abstracts filtering of observations outside domains
- `obsoper.domain.LatitudeBand` screens observations north/south of particular limits
- `obsoper.domain.Box` screens observations outside a lon/lat box
- `obsoper.domain.Polygon` uses a point in polygon test to deal with irregular shaped domains
- Added `obsoper.cartesian` helper function to map from longitude/latitude space into Cartesian coordinates
- Helps K-D tree search by removing issues with 180th meridian
- Distances in 3D space are more likely to represent true distances than "distance" in latitude/longitude space
- Added `obsoper.grid.CartesianSearch` to perform grid search operations using a KD-Tree in Cartesian coordinates.
- It relies on a wrapper of `scipy.spatial.cKDTree` called `obsoper.grid.CartesianNeighbour`
- Deprecated `obsoper.grid.Search` in favour of more descriptive name `obsoper.grid.TripolarSearch`
- Deprecated `obsoper.grid.NearestNeighbour` to be replaced by `obsoper.grid.LonLatNeighbour`
- Refactored `obsoper.horizontal` module
- Inlined `obsoper.interpolate` into `obsoper.horizontal`
- Extracted `obsoper.horizontal.Regular` horizontal interpolator to fulfill requirements of new `obsoper.Operator` class.
- Extended the [docs](http://obsoper.readthedocs.io)!