Initial functional checkin of the controller

Note: This does not yet handle artifacts, nor the logs from the builder-core, as we don't yet have those interfaces exposed
Except that design is fraught with issues, such as dealing with the build package artifacts. This design, on the other hand, will expressly wait for the current steps to finish before continuing, which ensures that the state of the system is known at all times. If we find the blocking to be too limited, we can change it, but it makes the code much harder to read and manage.