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.
@dannyroberts you're right. I always get confused when to use "iterator" (the thing returned by the function that Cory wrote) vs "generator" (a type of iterator) vs "iterable" (thing that produces an iterator when passed to `iter()`) and then there's "sequence" too. Here's a handy reference http://nvie.com/posts/iterators-vs-generators/