Given a symbolic expression, annotate it with a unique identifier that
can be used to maintain a connection with the given term. The
SymAnnotation is intended to be used as the key in a hash table
or map to additional data can be maintained alongside the terms. The
returned
SymExpr has the same semantics as the argument, but
has embedded in it the
SymAnnotation value so that it can be
used later during term traversals.
Note, the returned annotation is not necessarily fresh; if an
already-annotated term is passed in, the same annotation value will be
returned.