Add groups to greedy scheduling
Introduces the (Greedy-only) scheduler concept of SchedulerJob groups. Scheduler jobs can be assigned a group name (a string). Jobs with the same (non-empty) group name essentially all have the same priority (highest priority of the jobs) if they are "repeat jobs" (repeat forever or repeat N times). If they are not repeat jobs, group names would have no effect.
At the start, a higher job in a group might be scheduled and completes one repetition. When that job is about to start its second repetition, instead of running, another member of the group (that hasn't completed its first repetition) will get scheduled in its place. In general, if all members of the group are Repeat N or Repeat Forever, then the group will execute in lock-step, each member executing "repetition j" until they are all done, then the higher one will start "repetition j+1". In this way, for example, mosaic jobs can be scheduled to repeat and all jobs in the mosaic will repeat together.