Switch to using ObjectWrapper

Avoid having our own implementation of ignoring special properties.
Provide custom __get__ rather than proxying

Otherwise we risk our wrapper not being called, and instead the proxied
version being called directly. This caused issues when a method was
wrapped twice.