Move optimization.py
Break out Gurobi into separate "solvers" package
Fix missing import
Log debug level
Add ConstraintError
Add str function to SOS constraints + fix bug

Bug: SOS2 symbols must be some ordered iterable,
could not be e.g. a set.
Rewrite constraints a bit

All constraints now inherit Constraint.
Problem now has replacement rules and can simplify
its constraints prior to solve() call.
Constraints are now added with Problem.add_constraint()
instead of just modifying the set `constraints`. The
set `constraints` is now a property.