started cleanup up the socket mess

removed unused #include + dependency

more formatting fixes + fixed users of ReceiveSocket

cleaned more stuff up (converted from references to pointers is one)

wip. started rewriting everything, not quite finished

got everything except SensorOutput done (I think...)

got everything compiling except for missing SensorReceiver

worked on implementing the logic. didn't finish

made everything compile and finished implementing SensorReceiver

pulling over Austin's mock time stuff

added IncrementMockTime

finished up and started on tests

remembered something else
diff --git a/aos/crio/controls/ControlsManager.cpp b/aos/crio/controls/ControlsManager.cpp
index cfc429b..906394f 100644
--- a/aos/crio/controls/ControlsManager.cpp
+++ b/aos/crio/controls/ControlsManager.cpp
@@ -8,7 +8,6 @@
 #include "aos/crio/logging/crio_logging.h"
 #include "aos/common/Configuration.h"
 #include "aos/crio/aos_ctdt.h"
-#include "aos/crio/motor_server/CRIOControlLoopRunner.h"
 #include "aos/crio/motor_server/MotorServer.h"
 
 namespace aos {
@@ -29,20 +28,19 @@
   GetWatchdog().SetEnabled(false);
   LOG(INFO, "disabled watchdog\n");
 
-  RegisterControlLoops();
-  LOG(INFO, "registered control loops\n");
-
-  // CRIOControlLoopRunner calls part of MotorServer, so MotorServer has to get
-  // initialized first.
   MotorServer::Start();
   LOG(INFO, "MotorServer started\n");
-  CRIOControlLoopRunner::Start();
-  LOG(INFO, "cRIO control loops started\n");
 
   LOG(INFO, "calling init functions\n");
   aos_call_init_functions();
   LOG(INFO, "initialized\n");
 
+  RegisterControlLoops();
+  LOG(INFO, "registered control loops\n");
+
+  StartSensorBroadcasters();
+  LOG(INFO, "started sensor broadcasters\n");
+
   // Wait forever so that this task doesn't end to avoid confusing any brittle
   // FIRST code that might be hiding somewhere.
   while (true) {
diff --git a/aos/crio/controls/ControlsManager.h b/aos/crio/controls/ControlsManager.h
index 986fe02..aa78587 100644
--- a/aos/crio/controls/ControlsManager.h
+++ b/aos/crio/controls/ControlsManager.h
@@ -4,17 +4,24 @@
 namespace aos {
 namespace crio {
 
+// Designed for a subclass (that implements all of the pure virtual methods...)
+// to be passed to START_ROBOT_CLASS (a WPILib macro) to start all of the code.
 class ControlsManager : public RobotBase {
  public:
-  // Gets called when it is time to register all the control loops.
-  virtual void RegisterControlLoops() = 0;
   virtual void StartCompetition();
-  static inline ControlsManager &GetInstance() {
+
+  static ControlsManager &GetInstance() {
     return *static_cast<ControlsManager *>(&RobotBase::getInstance());
   }
-  inline DriverStation *GetDS() {
+  DriverStation *GetDS() {
     return m_ds;
   }
+
+ private:
+  // Hooks that subclasses have to implement to do the correct things at the
+  // correct times.
+  virtual void RegisterControlLoops() = 0;
+  virtual void StartSensorBroadcasters() = 0;
 };
 
 }  // namespace crio
diff --git a/aos/crio/controls/controls.gyp b/aos/crio/controls/controls.gyp
index 626cb89..ad253d0 100644
--- a/aos/crio/controls/controls.gyp
+++ b/aos/crio/controls/controls.gyp
@@ -11,7 +11,6 @@
         '<(EXTERNALS):WPILib',
         '<(AOS)/build/aos.gyp:logging',
         '<(AOS)/common/common.gyp:common',
-        '<(AOS)/crio/motor_server/motor_server.gyp:CRIOControlLoopRunner',
         '<(AOS)/crio/motor_server/motor_server.gyp:MotorServer',
         '<(AOS)/common/network/network.gyp:socket',
       ],