A messy CL with a bunch of changes...

- Changed Opt.value() -> Opt.getValue()
- Added a bunch of immutable classes (plus base class)
- Broke motion, but it's close I think to a good answer...
- Other minor refactorings for consistency