Refactor trajectory generation to separate process

This pulls all the trajectory planning into a TrajectoryGenerator class,
which produces a Trajectory spline that the drivetrain code can consume
and use to track the spline.

Broadly speaking, this change:
- Separates the Trajectory class into a generation class and a
  FinishedTrajectory class, where the generator produces a flatbuffer
  and the FinishedTrajectory reads all the required information from
  the flatbuffer.
- Add an option for serialization/deserialization of a DistanceSpline.
- Removes some dead code from Trajectory class (mostly having to do with
  the old feedback algorithm).
- Uses floats in more places, to keep the size of the Trajectory
  flatbuffer under control
- Update the tests & autonomous code to use the new spline code.

Further work that may make sense:
- Experiment with alternatives to current structure of the Trajectory
  flatbuffer to see whether (a) the size is a problem; and (b) if so,
  what we should do about it.
- Add shims to allow replaying logfiles with old-style spline goals.

Change-Id: Ic80ce4e384ec4d1bd22940580e3652ecd305b352
diff --git a/y2020/actors/auto_splines.h b/y2020/actors/auto_splines.h
index 5f53651..891228b 100644
--- a/y2020/actors/auto_splines.h
+++ b/y2020/actors/auto_splines.h
@@ -43,63 +43,76 @@
             "splines/autonav_slalom.json")) {}
 
   static flatbuffers::Offset<frc971::MultiSpline> BasicSSpline(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder,
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder,
       aos::Alliance alliance);
   static flatbuffers::Offset<frc971::MultiSpline> StraightLine(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder);
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder);
 
   flatbuffers::Offset<frc971::MultiSpline> TestSpline(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(test_spline_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> SplineRedA(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(spline_red_a_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> SplineBlueA(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(spline_blue_a_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> SplineRedB(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(spline_red_b_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> SplineBlueB(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(spline_blue_b_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> AutoNavBounce1(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(autonav_bounce_1_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> AutoNavBounce2(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(autonav_bounce_2_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> AutoNavBounce3(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(autonav_bounce_3_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> AutoNavBounce4(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(autonav_bounce_4_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> AutoNavBarrel(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(autonav_barrel_,
                                                     builder->fbb());
   }
   flatbuffers::Offset<frc971::MultiSpline> AutoNavSlalom(
-      aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder *builder) {
+      aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
+          *builder) {
     return aos::CopyFlatBuffer<frc971::MultiSpline>(autonav_slalom_,
                                                     builder->fbb());
   }