(Binary Analysis) Changed API for printing symbolic values

The data type for the second arg of InsnSemanticsExpr::print() has
been changed.  Instead of being an optional pointer to a rename map,
std::map<uint64_t, uint64_t>, it is now a reference to an
InsnSemanticsExpr::PrintHelper.

The PrintHelper allows user specified variable renumberings and/or
automatically generated renumberings.

The PrintHelper allows the caller to disable printing of comments
that might be attached to expression nodes. This will be needed
when we use hash values to speed up proofs of unequality since
comments should not be significant.
(Binary Analysis) Hash values computed for semantic expressions

In the InsnSemanticsExpr namespace for semantic expressions:

1. Expression nodes have a hash() method that returns a 64-bit
   hash value for the expression.  The hash value is computed
   and cached in the node.

2. An is_hashed() method returns an indication of whether the
   hash() method will return a cached value, or compute and
   cache a new hash.

3. The equivalent_to() method uses hashes (when available) to
   prove that two expressions are not structurally equivalent, and
   conditionally (depending on a #define) updates hash values. The
   equivalent_to() method is called by may_equal() and must_equal()
   under certain conditions.

Notes:

* Comments that might be attached to nodes do not contribute
  to the hash value.

* We use the alternate, 64-bit implementation of Fowler-Noll-Vo
  fast string hashing.  This is a fast, non-cryptographic hash.
  Not quite as fast as Murmur, but fewer collisions.

* Disimilar hashes imply non-equivalent expressions, but the
  converse is not true.