ttools: allow plotter to have multiple positions

Replace Plotter's hasPosition method with getPositionCount.
This is effectively a generalisation so that a plotter can
plot tuple sequences which represent zero, one or more positions
in data space, rather than just zero or one.

TuplePlotter, as well as getting some relevant changes, is also
renamed to AbstractPlotter, which is a more appropriate name.

JELDataSpec is refactored slightly so that Coords and associated JEL
expressions are aggregated into a new class CoordValue.  This makes it
tidier anyway, but especially with the way that coordinates are now
processed in Plot2Task.
topcat: refactor SimplePositionCoordPanel

Use composition/wrapping rather than inheritance.
This will make it easier to provide other options, like multi-position
instances.
topcat: allow multi-position coordinate entry panels
ttools: add pair plotter

Pair plotting is now done by a plotter with two positions, rather than
a single-position plotter with two extra non-positional coordinates.
This sidesteps the problem with changing DataGeoms, and generally
makes more sense.

Plotting is currently very basic (the only style option is colour).

Line drawing is done with a LineGlyph class, which is a placeholder
for a better implementation to come; it is currently grossly
inefficient and not thread-safe.
topcat: allow multi-position gang layer controls

If suitable plotters are provided by the plot type, topcat will now
display multi-position gang controls for 1 and 2 position plotters.
So you can now do pair plots.

The provision of non-positional controls is somewhat generalised
as well.
ttools: fix plan bug in LabelPlotter

A plan was being construed as matching even when the value type of the
associated cache map did not match (String instead of DepthString).
Actually, I'm not sure how this could happen, because I thought that
2D plots would always use String and 3D plots would always use DepthString,
but the fix, which involves storing Class<T> in the relevant places and
testing for equality, is harmless in any case.
ttools: replace Pixellator with Pixer in plot2

Pixel iteration is now done with one-use only plot2.Pixer objects
dispensed at iteration time by the Glyph rather than with re-usable
plot.Pixellator objects.

The main reason is to allow thread-safe iteration over pixels during
the plotting.  However, it also opens up the possibility of more
efficient algorithms.  LineGlyph has been rewritten much more efficiently
by using Pixers.

MarkForm and MultiPointForm still use Pixer adapters for existing
Pixellator objects.  This may not be very efficient, and the intention
is to rewrite the corresponding code without any use of the legacy
Pixellator-based code.
ttools: plot 2D pair lines without both ends in bounds

Previously pair links were only drawn if the points at both ends
fell in the plot region.  Now for 2D the line will be drawn anyway,
whether both, either or neither of the end points are in the
plotting region.

It would be nice to get this in 3D as well, but it's harder.  Maybe one day.
ttools: plot 3D pair lines if only one end is in range

Pair lines are now plotted if either end is in the cube, it doesn't
require that both are.  This does mean that you get lines poking
out of the cube sometimes.  It would be better to truncate the lines
as they pass out of the cube faces.  Maybe one day.