Basic framework for type inference.

This gets the infrastructure in place for forward-analysis-based type
inference, but doesn't yet actually do any inferring, yielding tables that
indicate that all symbols have unknown types.
RValue operands have get_type method for type inference.

Given a mapping of the currently-known types for symbols, returns the type
of the operand.
get_result_type method on operations, for type inference.

Given a type context, returns the type of the result of the operation.
As of this change, only implemented properly for CopyOperation, with a
dummy implementation that always returns "I don't know" for other
operations.
Fix TemporarySymbol.user_friendly_name.

Incorrect usage of the % operator was causing this to fail.
get_type_for_constant function.

Given a value created by one of the parser's constant expressions, returns
the Alamatic type for the constant.

As of this change, only implemented for integers.
Types have user-friendly display names.

For error reporting we will need to be able to name types, including those
containing un-filled type variables.
Add TypeTable.add method.

Where TypeTable.merge applied all of the mappings from an existing table,
TypeTable.add adds a single new mapping. TypeTable.merge is now implemented
in terms of TypeTable.add, as a result.

The expected unificatino method on types is now "unify", rater than
"merge" as before. However, neither method is yet implemented on the real
Type class.
Keep track of type equivalences that arise in unification.

This allows us to deal with the situation where what was previously two
separate types unifies into one single type. After unification we keep
track of the equivalences in a table, and then on retrieval we
opportunistically flatten the equivalence map so that the caller will see
the correctly-unified type.

Along the way the internal state for TypeTable became a pair of weakref
dictionaries, so we don't hold on to state from previously-visited
functions for the entire compilation process.
Convenience function to retrieve a fresh type variable.
Accessor to determine if a type is a variable.
Various sorts of iterators over TypeTable instances.
Basic type inference for assigning to symbols.

Allows type identity to be transferred through the assignment operator.
Unit tests for the type inference infrastructure.
Initial type inference framework.

Very basic right now, but it's a start.