Added IMetadataProvider so attributes can provide their own metadata

Any MetadataAttribute which also implements IMetadataProvider will have
its GetMetadata method called to create its metadata rather than having
its properties scanned.
Added tests for the IMetadataProvider