Rewrite in Go and restructure

# Work in progress

Submitting this mostly as a proof-of-concept of how this could be done in Go. I quite like it. If others do to, I can finish up validating the rest of the config.

Some things I would like to do with this:

- Add the concept of warnings. For example, an unknown key should be a warning, not an error.
- Add built-in updating (see [hk](https://github.com/heroku/hk))

I'd also love for this to automatically get run at the beginning of a build, which would incentivize us to actually keep this tool up to date and help people catch mistakes without having to necessarily install this tool.