Fix casting of extended Java types in bytecode

When building a cast expression where the type is a meta type, we use
the concrete class of the type the meta type is wrapping if the type is
a "bytecode" type; otherwise, we use gw.lang.reflect.IType. I'm not sure
why we do this, but it causes a problem when the type is an "extended"
Java type. The reason is that the concrete class of such types is based
on a Java proxy, whose name is not stable. So, the generated bytecode
won't work when re-loaded into a new JVM.

To fix this, introduce a new marker interface, ITypeImplementedByProxy.
Any type ref class based on a java.lang.reflect.Proxy will implement
this interface. Then, when deciding what type to use for cast
expressions, if the type is an instance of this new marker interface,
then just use gw.lang.reflect.IType.

Again, I'm not sure why we use the concrete class of the wrapped type
when it's a "bytecode" type. If we didn't do that at all, then this
wouldn't be necessary.