build: parallel doctrees

each builder now builds using its own doctree representation. This
means more I/O during the initial build process, and slightly more
storage requirements for building, but the builds run better in
parallel and are significantly more straightforward.