Better handle high-precision numbers in plotter

WebGL has relatively low floating point precision, and so attempting to
closely examine any signal which had even modest levels of precision
(e.g., attempting to plot a 32-bit integer) is an issue.

Add logic to pre-scale all of our points and readjust them periodically
while zooming to avoid precision issues.

Change-Id: Ibd51310fc2004a30c142bd5923a57961b6a20036
diff --git a/frc971/analysis/plot_data_utils.ts b/frc971/analysis/plot_data_utils.ts
index 8d42a4a..e918379 100644
--- a/frc971/analysis/plot_data_utils.ts
+++ b/frc971/analysis/plot_data_utils.ts
@@ -4,7 +4,7 @@
 import * as plot_data from 'org_frc971/frc971/analysis/plot_data_generated';
 import {MessageHandler, TimestampedMessage} from 'org_frc971/aos/network/www/aos_plotter';
 import {ByteBuffer} from 'org_frc971/external/com_github_google_flatbuffers/ts/byte-buffer';
-import {Plot} from 'org_frc971/aos/network/www/plotter';
+import {Plot, Point} from 'org_frc971/aos/network/www/plotter';
 import * as proxy from 'org_frc971/aos/network/www/proxy';
 
 import Connection = proxy.Connection;
@@ -79,10 +79,10 @@
             if (lineFb.label()) {
               line.setLabel(lineFb.label());
             }
-            const points = new Float32Array(lineFb.pointsLength() * 2);
+            const points = [];
             for (let kk = 0; kk < lineFb.pointsLength(); ++kk) {
-              points[kk * 2] = lineFb.points(kk).x();
-              points[kk * 2 + 1] = lineFb.points(kk).y();
+              const point = lineFb.points(kk);
+              points.push(new Point(point.x(), point.y()));
             }
             if (lineFb.color()) {
               line.setColor(