Alternate schema syntax: array of root module identifiers.

When the parsed schema is an array instead of an object, the Pipeline will interpret it as a list of root module identifiers.

This list of identifiers will be translated into a schema tree where each branch represents a possible subset of the roots list. The resulting tree can grow large if there are many roots, but there are a couple of reasons I'm not too worried about that:

- The number of generated bundle files is typically less than the number of keys in the tree, because bundles with identical contents are hashed identically.
- It should be feasible to keep the list of roots short, because the length of the list should be proportional to the number of major page types you want to support.
- You can always add new dependencies to existing bundles or combine related bundles instead of introducing new roots.
- The flexibility and reliability of knowing that any subset of the roots is valid is worth some extra disk usage.

Because all schemata have been assumed to be objects until now, this feature is completely backwards-compatible.

Closes #19.