Rename __allocate_obj__ to __allocate_object__.

Should try to use clear names where possible.
Use #equal?, not #eql?

Comment explaining this because I'm a nimrod.
Pass default init args to reinitializer if defined.

They may not actually be useful to the reinitializer, but it's better
that it's given them than not.
Move method and ivar definition into __infect_object__.

This should keep allocation and actual infection separate. Looks cleaner
that way, I think.
Allow caches to be given an existing array of objects to use.

Caches are still permitted to allocate new objects if they run out of
cached objects, but otherwise they'll pull from the given array.

The cache takes ownership of the array, so it should be considered very
bad behavior to try to modify the array afterward. The upside is that
this allows you to use stuff like Vec3Array from snow-math as the
backing for a cache, meaning you don't end up with as many tiny chunks
of memory being separately allocated for a bunch of vectors or what
have you.
Allow allocation of multiple objects.
Move cache instance methods into the CacheInstanceMethods module.

This is a lot simpler than defining them in a method.