refactor(util/list): provide an is_equal predicate parametrized by an equivalence relation on elements
refactor(kernel/expr): provide API for working directly with expr_ptr (expr_cell *)
refactor(kernel/expr): use is_equal instead of operator== for comparing expr's
refactor(kernel/constraint): use expr_ptr instead of expr
refactor(kernel/level): use is_equal instead of operator== for comparing level's
refactor(kernel/level): provide API for working directly with level_ptr (level_cell *)
refactor(kernel): mark operators== as deleted
refactor(kernel/expr): use level_ptr
refactor(kernel/expr): use level_ptr