...specifically because if we delay the actual uninstall, we need the
config to "stay alive" just to locate the app for the receiving code.
The repository plugins must handle app deletion asynchronously because
only the reactor head(s) has(have) write access to delete the physical
repositories. We'll never get to the auditor in question, though, if
the app config is deleted synchronously before the auditor runs as the
app is found for the auditor via its config.
The right place to call Application.uninstall(self, project) is as the
very last act of your uninstall method. Also shim Application.uninstall
to accept (alternatively) only a project id rather than the whole
project object.