3.3 “Haleakalā”

- [x] decide whether brush should dispatch events automatically during selection / transition (see discussion in #1461)
- [x] decide whether brush should store pre-transition state via closure or DOM (element.__chart__) [verdict: DOM]
- [x] brush should restore data-space domain (extentDomain) on transition end
- [x] implement an example of discrete brushing (snapping) to verify event design ([6232537](http://bl.ocks.org/mbostock/6232537), [6232620](http://bl.ocks.org/mbostock/6232620))
- [x] decide whether brush should floor extent ([Jason’s comment](https://github.com/mbostock/d3/pull/1460#issuecomment-22672968)) or rely on shape-rendering crispEdges
- [x] support transitions for the zoom behavior
- [x] investigate supporting smooth zooming for zoom behavior transitions (requires knowing viewport size?)
- [x] zoomstart should interrupt zoom transition
- [x] dynamic client-side simplification example ([6245977](http://bl.ocks.org/mbostock/6245977), [6252418](http://bl.ocks.org/mbostock/6252418))
- [x] decide whether to add d3.geo.simplify or expose d3_geo_streamTransform [verdict: d3.geo.transform]
- [x] a demo that composes viewport clipping and simplification ([6252418](http://bl.ocks.org/mbostock/6252418))
- [x] add d3.pairs?
- [x] add d3.geo.compose, or reconsider how to combine custom transforms and viewport clipping… feels like d3.geo.identity is a bit of a misnomer since the only reason it exists (versus just using null) is to apply viewport clipping to an identity transform. but sometimes you want to apply that to a custom transform, and it feels cumbersome to do that currently [verdict: no d3.geo.compose for now, but rename d3.geo.identity to d3.geo.clipExtent]
- [x] fix #1434 (time.nice and time.ticks)