Zoom behavior: clip scale to scaleExtent

Currently, it is possible to manually set a scale value outside a zoom behavior's scaleExtent.

````js
var zoom = d3.behavior.zoom();
zoom.scaleExtent();
 > [0, Infinity]
zoom.scale(-1);
zoom.scale();
> -1
zoom.scaleExtent();
> [0, Infinity]
````

This seems broken to me. If you disagree, fine, close the PR. There's already a clipping function `scaleTo` so we just call that.