Search jobs: spike out some search combinator jobs
Created by: camdencheek
Now that jobs are statically defined within the scope of a basic query, we can make combinator jobs that control the runtime behavior of a set of jobs.
This creates two new combinator jobs; JobWithOptional and ParallelJob.
JobWithOptional now encapsulates our logic for optional and required searches, allowing us to remove the Required method from the Job interface.
ParallelJob encapsulates the process of running a set of jobs in parallel.