It turns out that several classes, notably
Variable, override Object.hashCode() to use the content of
the object to construct the hash code -- as opposed to using
its internal address, which is what Object.hashCode() does.
This has an unfortunate consequence that if the object is
being constructed piecemeal (as it may be, for example, in
parsing), that its hash code will change over time.  If
during that period, the object is being used as a key to a
Map, then attempts to probe the map may return null because
the Map code is looking in the wrong place. Their is a
similar issue with Object.equals().

I attempted to modify the code to use the standard
Object.hashCode() and Object.equals(), but it turns
out that this is embedded so deeply into the thredds
code that it is almost impossible to remove. So, I am
backing it out and will use other solutions.
Merge branch 'target-4.4.0' of https://github.com/Unidata/thredds into target-4.4.0