This is the first stage in refactoring the pipeliner and making it more
accessible for backends to override and control. This separates the logic and
state required to *emit* a scheudule from the logic that *computes* and
validates a schedule.
This will enable (a) new schedule emitters and (b) new modulo scheduling
implementations to coexist.
NFC. Most of the code in ModuloSchedule.cpp is moved over from MachinePipeliner.cpp. This code is very complex and so I will not be touching this code in this review any more than necessary to keep this review NFC.