Fix incomplete extension state when failing to initialize.
Review Request #11136 — Created Aug. 12, 2020 and submitted
Extensions could end up in a half-loaded state if something went wrong
(such as a static media permission issue) during extension
initialization. They'd be removed from the list of initialized
extensions, but by this time they'd have instantiated and likely
registered hooks. This meant that subsequent attempts would make further
attempts to set up those hooks, causing more and more entries to pile
up. This could lead to the server getting swamped, and could cause all
sorts of page breakages, or other kinds of errors.
The extension manager now takes a more thorough approach to
uninitializing extensions when they fail. It performs a full
_uninit_extensionon them, which itself gracefully handles any issues
that might come up while attempting to uninitialize. This ensures that
every part of the extension we have any control over will be removed
from the extension manager and from memory.
Unit tests pass.