Clarify scripting api caching of model on load
grapher: fix xDomain, yDomain methods

IS [#56344486]

Setting xDomain previously had no effect because the domain would be set from the argument, then updateXScale would reset the domain to xmin..xmax. Similarly for yDomain. Additionally the getter form returned a reference instead of a safe copy of the xDomain.

It appears that xmin/max, ymin/max are intended to be the sources of truth for the graph domain, and are updated when the user drags the graph. So use them always.
grapher: observe scales to persist them to options

IS [#56344486]

Previously, it was required to remember to call persistScaleChangesToOptions() wherever changes to the graph axes' scales were be made.

It turns out scale changes caused by graph panning were not being persisted to options.xmin/xmax/ymin/ymax because panning is implemented by d3.behavior.zoom which automatically adjusts the relevant scales.

In order to capture *all* scale changes, this commit "monkey patches" xScale and yScale to persist any changes of their domains to the "properties of record", options.(x|y)m(in|ax).