Extend AnnotationMetadata and MethodMetadata

Update AnnotationMetadata and MethodMetadata to extend from a new
AnnotatedTypeMetadata base interface containing the methods that are
common to both. Also introduce new getAllAnnotationAttributes methods
providing MultiValueMap access to both annotation and meta-annotation
attributes.

Existing classreading and standard implementations have been
refactored to support the new interface.
Support for @Conditional configuration

Introduce new @Conditional annotation that can be used to filter
which @Configuration classes or methods are loaded. @Conditional
can be used directly or as a meta-annotation. Condition implementations
are provided via the 'Condition' interface and are free to filter based
on any criteria available at the time that they run. The
ConditionalContext provides access to the BeanDefinitionRegistry,
Environment and ConfigurableListableBeanFactory along with a
ResourceLoader and ClassLoader.

The existing @Profile annotation has been refactored as a @Conditional
with the added benefit that it can now be used as a method level
annotation.
Improve subclassing support in ConfClassPostPro

Update ConfigurationClassPostProcessor with an additional
afterLoadConfiguration method that can be overridden by subclasses.

Also add a protected getMetadataReaderFactory() method allowing
subclass access to the MetadataReaderFactory.
Add MetadataReaderLog interface

Add a MetadataReaderLog callback interface that can be used with
SimpleMetadataReader and CachingMetadataReaderFactory to decide how
meta-data read log messages should be handled.
Suppress metadata log messages on @Conditional

Update ConfigurationClassParser to suppress metadata read log messages
for @Conditional @Configuration classes when not loaded.
Make SpringFactoriesLoader.loadFactoryNames public

Update the SpringFactoriesLoader static loadFactoryNames method from
private to public.