Move BuildSpriteData to SpriteContainer and other optimizations
- Previously, *every* Sprite object instantiated and filled 1 or more new SpriteData objects. Since this data should be the same for all Sprite objects from the same SpriteContainer, it makes more sense (and performs better) to build the sprite data on the SpriteContainer.