Add support for extending JavaTypes

Introduce two new annotations, @ExtendedType and @ExtendedProperty,
which tell the Java typeloader to create "extended" types and properties
for the annotated elements. The "extended" Java type is a composite
object, made up of the original JavaType object plus some additional
data. It is currently implemented via Java Proxy, with all
IJavaTypeInternal and java.lang.Object methods being dispatched to the wrapped JavaType, and
all other methods being dispatched to the extension object. And, we have
something similar of Java properties: the "extended" Java property is a
composite proxy object, like the Java type. The difference is that the
equals() and hashCode() methods are re-implemented to be based on the
owning type and the property name, in order to continue to support
property info objects being used in maps and collections.