Fix #1453 - spurious interpolate when clean.

It looks to me like the d3_geo_clip polygonEnd check is assuming that if there
are no clipped segments that the input polygon is outside (and possibly
surrounding) the viewport. However, the clipped segments can also be empty when
the polygon is completely inside the viewport, in which case the listener was
already sent the input polygon (clean & 1). This check prevents additional
interpolation when there was no intersection.
Limit charge distance.
Optimize charge calculation.
Support parsing timezone offsets.

Note that the resulting Date object can only be in the local timezone
(or UTC), due to the limitations of JavaScript Dates.

Fixes #1494.
Support simultaneous zooming on multiple targets.

Fixes #1497, where a zoom gesture would break if a touch was started
outside the target during a gesture.

Each zoom gesture now only considers touches that were started on its
associated target element.  This allows multiple zoom gestures to occur
at once without conflicts.
Remove locations on touchend.

This avoids a potential bug where a touch identifier might be reused in
another gesture, but could still be referenced in locations0, thus
causing problems for the old gesture on touchmove.
Use distance instead of d3.event.scale.

Unlike d3.event.scale, which is a single value provided by the browser
(usually an average based on the position of all touches), we can
compute separate distances for each zoom gesture and its target,
allowing multiple gestures to occur simultaneously.
Optimise.

This block is only necessary if there are remaining touches, because
otherwise the gesture has ended and we remove this closure along with
locations0.  Thanks, @mbostock!
Rename for consistency.
Ensure that touch{move,end} listeners are removed.

Previously, if there were globally-active touches remaining, a given
zoom gesture was not ended even if locations0 was empty.  This fixes the
problem by checking to see if locations0 is empty.  If so, the gesture
is ended.
Tweak return value on touchend.

For consistency, always return undefined here.
Merge remote-tracking branch 'remotes/mbostock-original/time-parse-zone'

Conflicts:
	d3.js
	d3.min.js
	src/time/format.js
Merge remote-tracking branch 'remotes/mbostock-original/zoom-multiple'

Conflicts:
	d3.js
	d3.min.js
Merge remote-tracking branch 'remotes/mbostock-original/force-charge-distance'

Conflicts:
	d3.js
	d3.min.js
	src/layout/force.js
Merge remote-tracking branch 'remotes/mbostock-original/fix-clean-geo-clip'

Conflicts:
	d3.min.js