Templatized the geometry and texture caches

The object cache is now a template.  It takes two or three arguments:
the object type (an arbitrary structure, or container), a parser type,
and an optional cleanup routine struct.  The default cleanup is a no-op,
since all object types will not need cleanup.

The geometry cache has a cleanup routine which goes through each element
in its vector (the 'geometry' type is a vector of OpenGL display list
IDs), and frees up each of the display lists.

Also created a much stripped-down r9client.h, which removes most of the
contents of client.h.
Tidied the last bits of the templatizing

The parser was not being spawned correctly, and the operator[] was not
pulling things in a sensible way.

We may yet need to do more work, depending on how we want to load new
items into the caches, and handle fallback items.  It may be most
sensible, in the case that the object we're looking for is not in the
cache, to return a "fallback" object, and handle the work of loading
the actually desired object in another thread.  However, this may
require some locking, or some flags of some sort to prevent multiple
loads of the same resource.