ttools: add graphics for old-style 'frame' zoom to plot2 navigators

The frame drag zoom that was the main way to zoom in the classic plot
windows has its enthusiasts.  This commit adds the rubber-band
graphics for implementing this to the plot2 windows, using drag with
mouse button 2 (or shift).  The actual associated zoom actions are not
yet present.
ttools: refactor mouse event decoding logic

Move the logic that determines mouse position and button index from
individual Navigator implementations to NavigationListener.
Makes it easier to ensure that things are done consistently.
ttools: add old-style frame zoom functionality to plot2 windows

The PtPlot-style zoom GUI where you drag out a band and on drag
termination the plot is re-drawn to cover the given region is
now added, it uses the middle mouse button (or shift) drag in
plane, time and sky plots.
topcat: make some more icons available for documentation
ttools: mirror quadrants for band zoom actions

The Frame Zoom actions allow you to drag out a frame to focus in on
(or do something similar for zooming out).  However the sense of
these presents a problem: the sensible way to have zoom in on the Y
axis in the up direction, but behaviour of the corresponding function
in the old plot windows had zoom in going down (this older behaviour
came from PtPlot, which was presumably following AWT graphics coordinate
sense).

Solve this problem by allowing either up or down to be a zoom in (or out);
what determines the in/outness is just the X component of the drag
(right is in, left is out).  This comes down to mirroring the drag
actions in the previously unused quadrants (up-right, down-left).
topcat: update pair match window screenshots

The Output Rows part of the screenshots for topcat were from a pretty
old version (before the options for "Best match for each Table 1/2 row"
were introduced).  Update them.
topcat: preserve plot form config options when table is changed

Previously the global config options for Forms were reset when the
table was changed in a plot.  This was annoying if you were changing
a table but wanted to keep basically the same plot (reported by
Phil Evans, Leicester).  Fix it so that the old options are copied
over to the new style panel.
topcat: fix some documentation issues

Adjust the main montage screenshot slightly so that the plot toolbar icons
are the new ones not the old ones.  This montage still needs a major
overhaul since currently none of the plots shown use the new plotting
windows.

Also fix up the section on missing transparent/translucent shading modes -
these two were conflated in the docs, now there is one section for each.
topcat: repaint shading mode selector on mode change

The shading mode panel was not getting repainted properly when the
mode changed from Transparent to Translucent, though for most other
changes a revalidate caused a repaint as a side effect.  Now repaint
explicitly.
ttools: add "duff query" test to taplint

The TAP validator query tests now include a query with intentionally
illegal syntax, to check that the error document is returned in the
correct way.
vo: fix line-end bugs in UwsJob

The code for posting multi-part messages in UwsJob, and used by TapQuery
for doing TAP table uploads, was placing line ends incorrectly
(see Goldfarb's First Law of Text Processing).  In particular,
an uploaded VOTable lacked a CRLF before the terminating multipart boundary.
This was reported by Michael Tibbets at CFA, and was causing
incorrect error reports in taplint's UPL (upload) stage.
Fixed.

While I was there, I spotted another lurking bug related to multipart
line ends which would have caused errors if more than one stream
param header had ever been used (though I don't think it ever had) -
fixed that too.
ttools: avoid taplint E-MDQ-CTYP error report for BOOLEAN!=boolean

This behaviour may technically be an error since BOOLEAN TAPType doesn't
exist, but it's better reported elsewhere (if at all).
vo: add new TapQuery constructor

TapQuery now has a different constructors for upload and non-upload queries;
only the former can throw an IOException.  This simplifies invocation for
cases where upload is not required.
table: note SQL correspondences in JoinType documentation

1and2 = INNER, 1or2 = FULL OUTER, all1 = LEFT OUTER, all2 = RIGHT OUTER.
I've only just learned enough SQL to get this right.
util: fix incorrect package declaration in BeanTableModel
ttools: taplint tries not to truncate TAP_SCHEMA.columns table

taplint reads the columns from TAP_SCHEMA.columns to compare with
those declared from the tables metadata endpoint.  However for services
with large column counts, this was getting truncated, so it looked like
a discrepancy.  Avoid this (reasonably, but not totally reliably) by
setting MAXREC high enough.
ttools: taplint reports I[nfo] not F[ail] for missing ObsCore
vo: generalise registry access for use with multiple implementations

RegistryQuery is now an interface.  The previous implementation,
which works using the SOAP-based IVOA Registry Interface 1.0 standard,
is renamed as the concrete subclass Ri1RegistryQuery.
This opens the way for alternative RegistryQuery implementations,
so I can use the same framework for RegTAP registry queries.

Some of the other classes still need changes to work with different
implementations, which will be done in future revisions.

The RegistryQueryPanel and RegistryTableLoadDialog however
have been renamed as Ri1*, since I don't intend to update those
to use RegTAP - they would need a lot of changes, and if you want
to do free-form queries of a RegTAP registry you can use the TAP
load dialogue rather than needing a specific one like these.
vo: generalise registry selection for multiple implementations

The user registry selector component now uses a pluggable model which
provides a hook for selecting different registry service types (RegTAP).
vo: move query generation logic to RegistryProtocol class

The ADQL query is now constructed by a RegistryProtocol instance rather
than doing it in the KeywordServiceQueryFactory.  That localisation
makes it easy to provide a new RegTAP implementation alongside the
existing RI1.0 one.