Add benchmarkAPIurl to config.sample: copy to config.yml!

To be able to submit benchmarks to our Google Spreadsheet, this
config setting must be in your config.yml file.
Add Submit Benchmarks button that sends data to Google Spreadsheets

This bundles up the data in the Average row of the benchmarks table into
a data object and submits it to a Google Web App, which receives the
data and publishes it to a public Google Spreadsheet.
isolate modelView from Interactive aspectRatio/font-scaling

This isolates changes in font scale associated with
the interaction of Interactive aspectRatio changes
and actual window/container sizing from font scaling
used in model-container -- which for now enforces its
own independent aspectRatio.

[#57248996]
Add fingerprintjs library

This collects a number of properties regarding the user's
browser and other system information and hashes them into
a semi-unique "fingerprint" that can be used to approximately
identify a browser.
Makefile: make vendor/fingerprintjs
Load fingerprintjs when not running in production environment
Submit browser "fingerprint" with each benchmark
Add information about privacy due to new fingerprinting

Alternatively we could have a checkbox to allow a user
to submit data without their fingerprint.
latent-heat benchmark, has larger scripting load
make hydrogen-bonds benchmark public
Implement simple tools for functions instrumentation

Now you can require "common/performance" in any place in Lab
and then call:

performance.enterScope("scopeName");
(...)
performance.leaveScope("scopeName");

Benchmarks can use these scopes and get the average time spent in scope
or average frequency using:

performance.getAvgTime("scopeName");
performance.getAvgFreq("scopeName");  // in Hz

Note that data will be collected *ONLY* when you explicitly enable it
by calling:

.collectData(true);

So benchmark should do it at the beginning and when its tests end,
it should call:

.collectData(false)

to ensure that there is no additional overhead when users run
simulations without benchmarking.
Instrument model, rendering etc. code using performance.js module
Refactor MD2D benchmarks completely

Now data is collected during single run to ensure that all results
correlate better.

Use performance.js to get time spent in various scopes.

Additional changes:
- present time of various events in "ms" instead of "steps / s"
- rename some measurements (e.g. graphics is now JS rendering),
- add "tick" measurement, which consists of model step, JS rendering
  and all other JS code (e.g. user scripts). This is *not* simple sum
  of "model" and "JS rendering" values.
Change "layout (time in ms)" to "layout (ms)" to make headers consistent
Instrument Energy2D code using performance.js and refactor benchmarks

They use the same pattern as MD2D benchmarks now.
Instrument Energy2D code using performance.js

Accidentally this wasn't committed last time, it should be part of the
previous commit.
handle font-size for smaller and larger modelViews

[#57248996]

This is an incremental improvement and improves the
font scaling in modelViews by basing it on:

1. font scale calculated for width of Interactive
2. scaling associated with reduction in width of
   model in proportion to interactive.width
Measure time spent in engine instead of "model", what was too generic

Now there is clear division between time spent in engine and all
additional work made by Modeler.

This gives us much more information, e.g. now we can assess time spent
on scripts execution by comparing "tick" value with sum of "engine"
and "JS rendering".
Add new benchmark: simple model and rendering + really heavy script

It shows how we can asses time spent on script execution. Run this
benchmark and take a look on "engine" + "JS rendering" vs "tick".
Fix springs (radial bond style) rendering

[#57335036]