Major TileLayer + projections refactoring

This is a major refactoring of TileLayer code and everything that is related to projections. 

The TileLayer part that splits it into GridLayer and TileLayer will make the code much cleaner and allow to build other tile-based implementations easier. 

The long-standing projections refactoring will remove all corresponding ugly hacks across the code, consolidate everything projections-related into one place, make creating flat maps much easier, and also remove the need for ugly hacks in Proj4Leaflet plugin for different obscure projections.

### GridLayer + TileLayer 

- [x]  split `TileLayer` into `GridLayer` (with all the grid / tile positioning logic) and its child `TileLayer` (with logic for loading image tiles from tile servers)
- [x] remove `TileLayer.Anim.js`, split animation logic between `GridLayer` and `TileLayer`
- [x] remove all Earth hardcode in `Grid`/`TileLayer` implementations, make everything work depending on CRS
- [x] remove `TileLayer.Canvas` in favor of a much more flexible and powerful `GridLayer`
- [x] fix bounding and wrapping in `GridLayer` to allow negative coordinate space
- [x] cover `GridLayer` with some tests

### CRS & Projections

- [x] add `Projection` `bounds` property which determines projected coordinates bounds
- [x] add `CRS` properties: `wrapLng`, `wrapLat` (determining whether the world wraps and how) and `infinite` (if true, the layer will not be bounded, with negative tiles etc.)
- [x] add `CRS` `getProjectedBounds` that returns projected world bounds for zoom and corresponding `Map` `getPixelWorldBounds`, derived from `Projection` `bounds`, used for wrapping/bounding tiles
- [x] fix `EPSG:4326` to have 2x1 tiles at zoom 0, #1207
- [x] fix `Projection.SphericalMercator` to project to meter units
- [x] add `CRS` `unproject`
- [x] remove `LatLng` `wrap` and add `CRS` and `Map` `wrapLatLng` that depends on CRS, fix #1618 again
- [x] remove `MapDrag` `worldCopyJump` hardcoded logic to work for other projections
- [x] update **Proj4Leaflet** to reflect all projection changes (remove lots of ugly hacks)
- [x] cover `CRS` with more tests

### Misc. changes

- [x] improve `L.bind` to prepend real arguments to bound ones, and use native bind where available (was needed for a part of the code)

### Before merge

- [x] cleanup history with interactive rebase on master
- [ ] update changelog and document breaking changes

#2210 #1180 #2239