You can now drive around and fire shots, and shots explode at the end of their lifespan.
Additional debug information to try to figure out why only the oldest shot's light is showing up
Figured out the lights issue: apparently, lights created after materials are rendered don't show up until you tell the material that it needs an update.

So I was thinking I'd just preallocate a bunch of lights to avoid having to update /every single material/, but that caused massive performance issues.

So then I switched to WebGLDeferredRenderer as everything I've read says that it works just fine with tons of lights, but now the scene won't render at all. So that's where this is at.
Interesting... Problem with deferred rendering was twofold: 1, apparently the deferred renderer doesn't honor ambient lights, and 2, it doesn't honor THREE.DoubleSided either, and my ground plane just happened to be facing down.

It does, however, seem to honor emissive lighting, so I think I'm just going to use that for now.
Back to where we were with WebGLDeferredRenderer, except sprites don't work yet.
Basic example showing the exception I'm getting with sprites