Refactoring of component rule definition handlers

+review REVIEW-5134
Added rule-aware polymorphic container type that provides more context for duplicate type registration

- DefaultComponentSpecContainer and DefaultBinaryContainer now report the
  rule that created a duplicate registration

+review REVIEW-5081
Generified MethodRuleDefinition and ModelRuleInvoker

- Add ModelType.getConcreteClass() to return Class<T> instead of Class<? super T>
- Parameterize MethodRuleDefinition & ModelRuleInvoker on return type
- Parameterize DefaultMethodRuleDefinition & DefaultModelRuleInvoker on return type and instance type
- Use JavaMethod for method invocation within DefaultModelRuleInvoker

+review REVIEW-5081
Tidied up MethodRuleDefinitionHandler implementations

- Extracted annotation matching into a common base class, parameterized on annotation type
- Replaced ‘implements Spec’ with ‘Spec getSpec()’
- Renamed ComponentModelRuleDefinitionHandler -> ComponentTypeRuleDefinitionHandler

+review REVIEW-5081
Use ModelType instead of Class when processing component type rules

+review REVIEW-5081
Avoid cycle

+review REVIEW-5081