This saves perhaps 5% off startup time (measured by median of five runs
of `bin/py -c ''`), 10% off the time taken to execute ZCML (measured by
median of five runs of `bin/harness </dev/null`), and paves the way for
some further improvements by generally trimming cruft from our
dependency tree.
I considered instead pruning the tree by making `ZODB` an optional
dependency of `zope.app.appsetup`, or something along those lines.
However, like much of `zope.app`, `zope.app.appsetup` and
`zope.app.wsgi` are fundamentally built around the assumption of running
the full Zope application server. Launchpad uses the Zope Component
Architecture and many Zope Toolkit components (which are intended for
use in various different application server environments), but it isn't
built around the Zope application server, and we've had to work around
some resulting impedance mismatches for a long time. Architecturally, I
think it would be better to let `zope.app` do its own thing as
appropriate for that application server environment, and remove the
relatively small number of remaining uses of it from Launchpad.