Re-add textBoxes to model json after conversion.

Add text boxes to tests. [#37610629]
rm inserted html tags and /n's from textboxes

[#37610629]
Replace foreignObject with text, use authored location.

[#37610629]
Move all text boxes to top layer.

Unlike images, MW does not seem to provide a way
to add textBoxes to a layer below the atoms.

However, this is probably something that we will want
to support in the future.

[#37610629]
Parse textbox location using toNexgenCoordinates

Y axis wasn't being flipped

[#37610629]
Wrap text to given width if specified in textBox.

Add helper function to wrap text such that each line
at least one word long but (if possible) is less or
equal to the desired length when rendered. Note that
getComputedTextLength() will return a pixel value, but
this value depends on the current size of em, and so
scales correctly with our view.

Note that textBox widths do not exist in MML, so we
do not convert any, and so currently the only way to
see this is to edit the modelOptions in the interactive.

[#37610629]
Allow interactive's viewOptions to set images and textBoxes.

Previously these would always get over-written by the
original images and textBoxes, because of the order
of operations here.
For now, completely replace arrays in interactive's options.

If we are replacing properties of the original model
using the viewOptions or modelOptions in the interactive,
specifying an array property will not completely replace
the original array, instead of only replacing the first
n elements of that array.

This seems to follow the principle of least-surprise for
what an author would expect.

If needed, we could add a function in the future for an
author to be able to replace or amend specific existing
elements of the original array.