Fix JNI proxy infrastructure

We previously had weak-maps for passing objects from Java to C++ (necessary for listeners etc),
but each C++->Java pass would previously create a new proxy. This change:

- Unifies the +c and +j wrapper types, allowing an interface to be +c +j
- Fixes C++->Java object passing to use the existing wrapper if one exists
- Fixes both C++->Java and Java->C++ to "unwrap" an object if need be (allowing a Java object to be passed to C++ and then back properly)
- Adds tests for all of the above