Separate storage buckets for each type

Pros:
- Models can clean up after themselves when destroyed with a simple count by hash
- More descriptive path names

Cons:
- Less elegant API
- No deduplication across buckets (probably doesn't matter at all)