Modular build pipeline

I spent some time refactoring the build logic into a modular structure. I've formalized the concept of a "build pipeline" with the `Builder` object that contains static functions used to create a build pipeline.

This structure allows for further extensions to the core functionality (copy external assets after build, only rebuild changed files, etc.)