cache asset files with the `Dassets[]` asset lookup method

With the addition of the source cache and combinations, creating
AssetFile instances is not a trivial/fast as it originally was.
This is especially true for large/complex combinations.  This
adds a cache for the asset file lookups so that the asset files
are not continually rebuilt each time they are accessed.

This preserves the ability to alter existing asset files without
needing to reload.  However, if you make a change to any combinations,
you will need to reload Dassets to clear this cache and see you
changes.