PrairieMetadata: keep reference to element parents

Specifically, each <File> now knows its <Frame>, and each <Frame> now
knows its <Sequence>. This will useful for handling the more compact XML
structure of PrairieView 5.x, in which parameter values are inherited
from parent elements where feasible.
PrairieReader: avoid NPE when CFG file is missing
PrairieMetadata: add an attribute accessor method

This returns null when the attribute is not present, rather than the
empty string. It also makes the code slightly shorter.
PrairieMetadata: add data structure for key/values

The key/value pair structure got more complex in PrairieView 5.2. Now
each key can point at either a single string item, or at a table of
values, which can themselves point at sub-tables.

This data structure is intended to facilitate easy management of the
new structure, while still supporting the old structure, too.
PrairieMetadata: add helpful helper methods

These are useful when dealing with possible null values.
PrairieMetadata: use ValueTable as appropriate
PrairieMetadata: parse old-style keys into tables

As of PrairieView 5.2, the key/value pair structure is more
hierarchical, with value tables able to contain sub-tables.

Let's parse the old-style keys in the same way, so that regardless of
which version of PrairieView wrote the data, it can be consumed in the
same way after parsing.
PrairieMetadata: rename field, to avoid ambiguity

We are going to add additional ValueTable fields in other places,
and calling them all "values" gets confusing (and causes IDEs to
emit warnings about variable names shadowing one another).
PrairieMetadata: add a way to parse new key/values

PrairieView 5.2 stores the key/value structure differently: it uses a
sequence of PVStateValue elements with IndexedValue and SubindexedValue
elements underneath. This commit adds the code necessary to parse such
structures into a ValueTable object.
PrairieMetadata: parse PVStateShard at all levels

There are three levels where PVStateShard subtrees appear:

1) PVScan (the top level)
2) Sequence
3) Frame

Let's parse all of them into separate ValueTable objects.
PrairieMetadata: fall back to ancestor ValueTables

If a Frame's ValueTable (i.e., PVStateShard) does not contain
a requested key, search its parent Sequence for the same.

Similarly, if a Sequence's ValueTable is missing the key,
search the top-level PVScan's ValueTable, too.

This behavior is required to support the new "smaller XML file format"
which has been an option since PrairieView 5.0, and the only option
since PrairieView 5.2.
PrairieMetadata: short circuit single-value tables

When calling value() on a ValueTable, if there is only one entry in the
table, let's just return its value directly. See comment for details.
PrairieReader: purge broken links, add author tags
PrairieMetadata: fix typo in javadoc
PrairieReader: consolidate XML/CFG references

Rather than having separate hardcoded methods, let's just have one
method called "findMetadataFiles" that looks for all the unspecified
ones. And refer to them as "Prairie metadata files" for generality.

This will be useful when we add support for ENV files shortly.
PrairieMetadata: tweak flow of channel parsing

We should at least _try_ to parse the active channels, even if a CFG
file was not present. This will be useful soon, when that information
could potentially come from another source (the ENV file).
PrairieReader: also parse ENV metadata files

Start with version 5.2, the CFG file was replaced with an ENV
that is similar conceptually, but with a revised XML schema.

It does contain many of the same key/value pairs, though, including
the ones in which we are most interested (channels, bitDepth, laserPower
and xYStageYPositionIncreasesBottomToTop in particular), so for now we
parse the metadata into the same config table used by the CFG file.
PrairieReader: fail fast when no active channels

Otherwise, an obtuse exception is raised later in
MetadataTools.populatePixels because sizeC is 0.
PrairieReader: remove unused private method
Use the unique position coordinate count as backup method of setting the position count