Refactor report generation code some more

Split report formats (text, html, csv, etc) into separate classes, pull most everything out of `Report` into either a specific class or `Report::Base`.