issue #23894: add ability to install third-party extensions using npm

This code will add an "Install Extension" privilege. Users with this privilege will be able to go into the setup->configure->database information screen, and type in the name of an xtuple extension to install. The extension has to be a published npm module. Currently, the only one is xtuple-ice-cream.

Installing the extension in this way will register it with the database so that it it will be reinstalled during `build_app`. `peerDependencies` are used in the extension to make sure that the right version will be used. The core will load the most recent version of the plugin that's compatible with the core version. If there's no version of the extension that's compatible with the core version, the update will fail, and the extension (if it's already been installed) will have to be removed.

This system is developed first and foremost for field dev, and third-party extensions. However, it's likely that this methodology will replace the `xtuple-extensions` and possibly the `private-extensions` repos altogether. It also liberates the extension release cycle to be no longer in lockstep with the core release cycle, without the need to consult a human-readable dependency matrix.
That's the end goal. Right now, though, only `xtuple-ice-cream` is installable through npm. Once this is stable I imagine we'll npm publish the rest, and likely get rid of xtuple-extensions, etc. Until we do that, though, we need to support both methods.