couple of typo / formatting fixes
remove NeedsFullResolver internal checked exception

I think this was a relic of some earlier idea about how to do
things. It was used in one place that could just use the
public NotResolved exception, since it was converted to that
later anyhow.

To avoid error-message regression, we still catch NotResolved
and change it into a NotResolved with a different message in
certain cases.

Also clean up the wording of NotResolved in various places.
Probably NotResolved could just have a zero-parameters constructor.
split 'ResolveSource' from SubstitutionResolver and ConfigSubstitution.

this is part of a plan to remove SubstitutionResolver (moving the
memoized hash to ResolveContext) and to move the "replacements"
functionality to ResolveSource. Should be clearer.
move the memoizing functionality out of SubstitutionResolver
Delete SubstitutionResolver, so it's all in ResolveContext now
move the "replacements" functionality to ResolveSource from Context

Conceptually, a "replacement" is a transformation of ResolveSource
move "replacement" handling from ResolveContext to ResolveSource

this is where it belongs conceptually
make ResolveSource.replacements use the value, not MemoKey, as key

The MemoKey stuff here was leftover from some earlier version of
the code, and was no longer used (the restrictToChild was always
null in the MemoKey).
Split ConfigSubstitution into ConfigConcatenation and ConfigReference

This makes the code a good bit simpler to reason about, the old
ConfigSubstitution really mixed two things into one class.

Unfortunately old ConfigSubstitution is hanging around as a compat
shim so we can deserialize stuff from the old version of the library.

The old version will not be able to deserialize unresolved configs
from this new version.

In retrospect it might have been better to forbid serialization
of unresolved configs and only support serializing resolved configs.
Clean up code and semantics around self-referential handling

The basic idea in this patch is to unify on the "replacer"
(modifying the tree in which we lookup substitutions)
mechanism for detecting cycles.

Drop the "traverse" method, instead keeping a trace of expressions
we've passed through for nice error messages.

There is now only one internal checked exception possible,
NotPossibleToResolve which is thrown when a cycle is detected;
this checked exception is always caught by ConfigReference
so cannot "escape" from the library. The exception exists
because we want to get the traceString debug info out
of the spot that detected the cycle, if we didn't want that
debug info we could just return null as usual for undefined.

As part of simplifying this (which should also simplify the
spec), resolutions which require double-traverse of the same
reference are no longer supported:
   a=1, b=${a}, a=${b}

Also, cycles now always throw UnresolvedSubstitution rather
than BadValue. This was needed for consistency since
conceptually a single a=${a} is going to "look back" earlier
in the merge stack, discover there is no earlier value of a,
and fail; it should be the same exception as a=${a},a={b:1},
and in both cases referring to these cycles via ${?} should
hide the exception.
fix error message for type errors mid-path

If you looked up "a.b.c" and b is not an object, it said
"a.b.c is a FOO and not an OBJECT"
now it says
"a.b is a FOO and not an OBJECT"
Fix semantics of references from _inside_ a field value to that field

vs. the value itself being a reference to the field.

So this looks "backward":

  a : ${a}

vs. this does not:

  a : { b : ${a} }
Assert that delayed merge stacks don't contain other delayed merge stacks
don't need to replace() in ConfigConcatenation

Because the cycle is detected by the nested ConfigReference.
Improve the spec's description of self-referential semantics
remove ignoresFallbacks param from AbstractConfigValue.newCopy

Only one subclass ever used this, SimpleConfigObject

So now we have withFallbacksIgnored that asserts they are
already ignored, for the other classes, and has a special
SimpleConfigObject implementation.