Major TileLayer + projections refactoring

- [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 TileLayer.Canvas in favor of a much more flexible and powerful GridLayer
- [x] add CRS properties: `wrapLng`, `wrapLat` (determining whether the world wraps) and `infinite` (if true, the layer will not be bounded, with negative tiles etc.)
- [x] add Projection bounds property which determines projected coordinates bounds
- [x] improve CRS getSize to calculate the world size correctly, derived from Projection bounds
- [ ] remove MapDrag worldCopyJump hardcoded logic to work for any projection
- [ ] find and clean up any remaining Earth-related hardcode across the code
- [ ] update Proj4Leaflet to reflect the changes
- [ ] cover GridLayer and TileLayer with lots of tests