Rewrite opaque struct accessors to allow for dynamic offsets.

* Upgrade to C++
* Added "magic" accessor classes, see magic3.hpp for documentation.
* The plan is for init_offsets to go through loaded modules and grab the right
  offsets from debugging information. It's just a static encoding for now.