Adds location information to callbacks

- Callbacks are now passed a genericish data object, this should prevent the
  function signature from changing in the future
- With this additional data callbacks now know their address, so they don't need
  any hacky tricks to figure out a proper return address