User configurable reports

the plan is to pilot/QA on this on prod so I'm putting it out for code review now. I'm guessing it's easiest to review as a whole, though the commits should represent ~atomic actions.

I think it's good to merge whenever code review passes.
Small thing, but if we do this a lot, might be worthwhile to add a `wrapper` param to `iter_docs` and have this be

```python
return iter_docs(cls.get_db(), ids, wrapper=cls.wrap)
```