Architecture Changes For Performance

Initially batch processing computed a UniqueGMMatches table from which
other statistics could be derived as necessary by the web project, but
as dataset size increased this processing became noticeable.

This commit restructures the derived statistics to be calculated as part
of batch processing, and stores them in the database, making the web
project now responsible only for selecting the correct data, resulting
in a huge performance gain and improving efficiency by avoiding
recalculating the same statistics multiple times for the same batch of
data.

To facilitate this an extensible hierarchy of PostProcessingJobs has
been created with a class and table structure designed to allow new jobs
to be added very easily, with jobs encapsulating all of their own
specific processing logic.

History calculation was however still intensive, so this has been
reworked to be calculated incrementally from previous outputs instead of
being recalculated from scratch with each batch input.