Refactoring

Make lower bound computation modular to support different types of lower
bounds. The interface LowerBound is inherited by 2 implementations
ModeLowerBound and RolloutLowerBound. A problem's model inherits from both
the Model interface and one of the 2 lower bound implementations. Reason for
this will be elucidated in the documentation later (short answer: different
lower bound strategies require different problem-specific things, so we allow
the problem writer to fill in the required methods by making them virtual in
the lower bound implementation and inheriting from it.)