Rework option overriding to be more robust

This commit reworks the option overriding to be much more robust,
changes include:

- Support for merging duplicate options introduced via @Inject'd
  delegates
- Detection of illegal overrides where options have overlapping name
  sets
- Further test cases
Support type changes in option overrides

This commit adds support for type changes when overriding options if and
only if the type change is a narrowing conversion
Improved option overriding test cases

- Add expected error message regexes
- Add friendlier error message for bad widening type change