fix(util/stackinfo): make sure check_stack can be invoked before 'main' (i.e., during initialization)

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
fix(util/lru_cache): typo

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
refactor(library/placeholder): use different names for different placeholders, it is bad design to assume that two structurally identical expressions are different when they are allocated twice (this design is not compatible with any form of hash-consing

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
refactor(library/aliases): it is bad design to instantiate parameter using the parameter name, the parameter names have no semantic value

Moreover, we could create type incorrect aliases by "accident".

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
feat(kernel/expr): add optional expression caching (aka "partial" hash-consing)

We do not enforce full hash-consing because we would need to synchronize
the access to the hashtable/cache.

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
feat(kernel/expr): add optional expression caching (aka "partial" hash-consing)