(#18211) Refactor daemon run loop

This adds a Scheduler module to puppet to handle the daemon run loop. The loop
involves two separate wakeup cycles, in which one can adjust the interval for
both. Refactoring into classes makes it easier to reason about and test the
correctness of scheduling. This should fix #18211.
(#14766) Add splay support to the scheduler

This adds a class that implements a job that runs with a constant offset. It
also adds a factory method to create jobs and uses it in the daemon loop to
implement splay.

Paired-with: Andy Parker <andy@puppetlabs.com>
(#14766) Calculate runinterval from the start of a job

In the fix for #14766 we inadvertently changed the calcuation of runinterval
to happen from the end of a job instead of the start. This fixes that by
making the time dependencies in Scheduler explicit and adds a test that would
have caught this regression.
Merge pull request #1594 from pcarlisle/run-loop

Run loop