move observers between threads as required

When a module is unloaded and re-loaded any existing observers need to
be moved to the thread the module is executing on