Control animation in setView/panTo/setZoom/fitBounds/etc.

Implements #1616. Since zooming and panning have different animation mechanisms, I propose the following API:

```js
map.setView(center, zoom, <ZoomPanOptions>);
map.fitBounds(bounds, <ZoomPanOptions>);
map.panTo(center, <PanOptions>);
map.setZoom(center, <ZoomOptions>);
...
```

ZoomPanOptions:

```js
{
  // true will reset the view to clear state completely (without any animations etc.)
  reset: false
  zoomOptions: <ZoomOptions> // will be used for zoom change animation
  // will be used for panning animation (also includes duration, easing etc.)
  panOptions: <PanOptions>
}
```

Both `zoomOptions` and `panOptions` have `animate` option. Panning behavior:

```js
// not specifying `animate` will cause animated pan if animating not more 
// than a screen away or reset the view if it is
map.setView(center, zoom); 
map.panTo(center);

// animate: true will force it to always animate pan if possible
map.setView(center, zoom, {panOptions: {animate: true}}); 
map.panTo(center, {animate: true});

// animate: false will turn off animation, just shifting the map pane
// if not more than a screen away, resetting the view otherwise
map.panTo(center, {animate: false});

// panBy is similar to panTo but it never does the pan distance check,
// so it either animates or shifts map pane depending on animate options
map.panBy(offset, {animate: false});
```

Zooming behavior:

```js
// no `animate` will cause animated zoom if zoom origin is inside the current view
map.setView(center, zoom);

// animate: true will attempt animation disregarding where the zoom origin is
map.setView(center, zoom, {zoomOptions: {animate: true});

// animate: false will always cause full view reset when zooming
map.setView(center, zoom, {zoomOptions: {animate: false});
```

It may look a bit complicated at first but it's the simplest API I could think of that covers all the use cases.

@danzel @tmcw @jfirebaugh Comments? Suggestions?