Refactor; Support custom databases

Wow, so much! This allows users to specify an IndexerSpec which is responsible
for gathering data from the database.

I also abstracted out Cacheing a bit further so it can be customized.

Fixes #1
Fixes #2