Performance Optimizations
- Adding `__slots__` for all classes
- Removing all usage of `property` calls from internal callers (to avoid function call overhead)
- Avoiding un-necessary data copying, e.g. `nodes[[0], :]` creates a copy but
python
nodes[0, :].reshape((1, 2))
does not ([more details](https://docs.scipy.org/doc/numpy-1.6.0/reference/arrays.indexing.html#advanced-indexing))
- Adding `_verify` switches to selectively disable overly defensive value checking. Added to [`CurvedPolygon`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curved_polygon.html#bezier.curved_polygon.CurvedPolygon) constructor, [`Surface.evaluate_barycentric()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.evaluate_barycentric), [`Surface.evaluate_cartesian()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.evaluate_cartesian), [`Surface.evaluate_multi()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.evaluate_multi) and [`Surface.intersect()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.intersect). Internal callers with already verified data now skip verification steps
- [Bailing out early](https://github.com/dhermes/bezier/commit/db816eb5a748bb997adcc2d7d9008638e22a824c) if surface bounding boxes are disjoint in [`Surface.intersect()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.intersect)
Breaking Changes
- Requiring `degree` in [`Curve`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curve.html#bezier.curve.Curve) and [`Surface`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface) constructors, but adding [`Curve.from_nodes()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curve.html#bezier.curve.Curve.from_nodes) and [`Surface.from_nodes()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.from_nodes) factories to accept nodes only (computing the degree in the constructor every time is a waste of flops, especially if the caller knows the degree)
- [Removing](https://github.com/dhermes/bezier/commit/3393b9010c26b55a9c29afc2702426bb179b85a1) public [`Curve.copy()`](http://bezier.readthedocs.io/en/0.2.1/reference/bezier.curve.html#bezier.curve.Curve.copy) and [`Surface.copy()`](http://bezier.readthedocs.io/en/0.2.1/reference/bezier.surface.html#bezier.surface.Surface.copy)
- [Removing](https://github.com/dhermes/bezier/commit/3393b9010c26b55a9c29afc2702426bb179b85a1) custom equality checks for [`Curve`](http://bezier.readthedocs.io/en/0.2.1/reference/bezier.curve.html#bezier.curve.Curve.__eq__) and [`Surface`](http://bezier.readthedocs.io/en/0.2.1/reference/bezier.surface.html#bezier.surface.Surface.__eq__) objects. The previous implementation did not factor in all relevant values
- Returning `1xD` arrays [instead of flattened](https://github.com/dhermes/bezier/commit/b5e5b327594c6143956ed98703f596ff82b7501a) `D`-dimensional 1D arrays from [`Curve.evaluate()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curve.html#bezier.curve.Curve.evaluate), [`Surface.evaluate_barycentric()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.evaluate_barycentric), [`Surface.evaluate_cartesian()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.evaluate_cartesian), and related helpers
- Renaming [`Intersection.left/right`](http://bezier.readthedocs.io/en/0.2.1/algorithm-helpers.html#bezier._intersection_helpers.Intersection.left) as [`first/second`](http://bezier.readthedocs.io/en/0.3.0/algorithm-helpers.html#bezier._intersection_helpers.Intersection.first) (They were poorly named originally, since "left" and "right" were in reference to where they were used **in code**, not geometry. This class is not part of the public interface, but it is documented.)
Bug Fixes
- Handling cases where one corner of a surface touches another but their interiors don't intersect (in [`Surface.intersect()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.intersect)). Adding `ignored_corner` classification to handle these curve-curve intersecions that don't contribute to a surface-surface intersection
- Throwing exception in [`Curve.locate()`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.curve.html#bezier.curve.Curve.locate) when the subdivided intervals are very far apart (13)
- Improving [`Surface.is_valid`](http://bezier.readthedocs.io/en/0.3.0/reference/bezier.surface.html#bezier.surface.Surface.is_valid) by considering the signs of the Jacobian determinant at corner nodes (12)
Miscellany
- Adding possible strategy to avoid linear convergence in [`newton_refine()`](http://bezier.readthedocs.io/en/0.3.0/algorithm-helpers.html#bezier._intersection_helpers.newton_refine)
- Adding AppVeyor configuration to make sure there are no Windows issues, testing exclusively with `conda` install
- Updating generated images with `matplotlib` 2.0