Bugfix for the BLockReturnValue analysis

Before, querying for the returned values of a block would return partial
results in some cases.  The root cause is that return values aren't
pushed back past certain dominance relations.

Not pushing is correct, but it caused misleading values to be returned.
Now, if a value is not pushed back because of dominance, that path is
"poisoned" and queries where information would be missing now return
Nothing.
Performance tweak for Andersen

The nodes in the constraint graph need to be compared and the
type-based comparison was too expensive (since types are expensive
to compare).  Convert them to Text and just compare that instead.
Add a uses-of analysis

This information is available in LLVM and is occasionally useful.
Storing it in Values directly would be difficult with this IR,
though, so we store it on the side and it can be computed as-needed.

It is computed for an entire module at a time, so cross-function
information is available.