GC optimizations

The tile renderers currently generate a lot of temporary `ol.TileCoord` and `ol.TileRange` objects. This causes the garbage collector to run frequently, leading to dropped frames.

This PR goes some way towards addressing the most serious problems. Many temporary objects are still generated, but they tend to be once-per-frame rather once-per-tile-per-frame.