When the AvailableModulesList is destroyed, it will wait for the current
module scanning job (running on a background thread) to complete. This
job will try to take the AvailableModulesList::lock when it completes,
so the lock must outlive the background thread.