scoring: add test groups

Previously a `Task` had `TestCases`, and we'd do scoring by summing the number of completed test case, and the total score would be the % of total tests completed.

Instead, this implements Test Groups. Each test group has a set of tasks, and you only get the points for that group if you complete all the tasks within it.

@xldenis
lol!