Feature: Flywheightening

This reduces duplicated use of classes as assets and components, and separates the the difference between the two. This implements the [flyweight pattern](http://gameprogrammingpatterns.com/flyweight.html).

Assets are the actual data loaded from the file system (i.e. Meshes, Textures, Sounds...). There should generally only be one instance of each type for each asset. The exception here is Materials, where they should all be unique.

AssetRefs are references to the assets, and are the actual components. Each has (minimally) a reference to the asset, as well as a string that is the asset name (for serialization/deserialization purposes).