Explicitly mark declared symbols as uninitialized.

Before we were leaving them unset in the datastate, causing merge
operations to blow up with a KeyError when trying to resolve a
conditionally-initialized symbol.
Fix a few more spots that led to bad error messages.

These are remnants of the old style where the caller was responsible
for reporting errors caused by unknowns in the interpreter.
Give details when failing on ambiguous symbol type.

If multiple possible initializations of the same symbol result in different
types then that is an error, as before. Now, though, we will include
in the error message a list of all of the competing initializations so
the user can more easily find the erroneous one and fix it.
Declare position when assigning to a symbol name.
Don't blow up when trying to compare integers with other stuff.

In particular, our merging code was now trying to compare integers with
MergeConflict objects.
Flatten existing merge conflicts when merging.
Pretty up the error messages for inconsistent types some more.