Made each tile on a map a seperate object, added sprite caching

The sprite caching is there so that sprites don't get unnecessarily duplicated, and end up wasting memory.
The tiles are now seperate objects because if they were the same object, they'd affect every tile of the same type!

TODO: Make Tile subclasses, instead of specifying spritePath on init