Refactors the balloon controller so we inject in its sensors and data writers

This makes the code more testable - we can mock the dependencies during
testing. This also separates out the increasingly
complicated code which is used to initialise our writers and sensor
controllers. In the future we might want to break these things out into
a separate factory class. For now we're just using factory methods.