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.
Minor: could be rephrased as `next(choice_obj for choice_obj in self.choices if choice_obj.value == choice)`, which would only get the first generated value instead of creating the entire list and then selecting the first one. The error will be different if there are no items: `StopIteration` instead of `IndexError`.