effects: add asset management

People can request an instance of an effect by supplying the vertex and
fragment shader files. If the effect already exists, that one is handed
to them. If it doesn't, it's created. Reference counting is done with
'std::shared_ptr' so that they don't hang around longer than needed.

get_effect_by_name was removed so that effects can't be accessed
globally.

get_all_effects was also removed for the same reason. There's no reason
to have access to all effects everywhere.
textures: remove get_all_textures

We probably shouldn't provide global access to all textures. Bad design.
textures: delay set_contents until context exists
textures: fix destructor not being virtual
textures: add constructor that takes a file path
textures: add method to get new file or from cache
textures: use smart pointers
drawables: add set_effect overload for file paths
drawables: add set_texture overload for file paths
Merge branch 'feature/asset-management' into develop