Texture atlas

* Combines `TextureAtlas` and `TextureAtlasBuilder`. 
* Makes `TextureAtlas` and `BillboardCollection.textureAtlas` private.
* Removes `Billboard.imageIndex` and adds `Billboard.imageUrl` and `Billboard.image`.

For #1688.

The functions in `TextureAtlas` were changed to mimic those that were in `TextureAtlasBuilder` though it may be better to return promises. See the use of the `TextureAtlas` in `LabelCollection` which expects the callbacks to be executed before returning.


So what happens if b1 is a canvas in a different collection?  It looks like it just treats it like a URL and would fail silently?  Since it's an edge case, I'm okay with this going in as-is; but in the future couldn't we do some extra bookkeeping and make the canvas -> id -> texture mapping global?  Or does that have some drawback I'm not seeing?