Third rewrite - targets and builders

- Differentiate between targets and builders
- Targets are now the objects that have dependencies (not builders)
- Only targets can be executed
- Targets are defined by the user
- Builders are defined by the application
- Targets specify which builders to execute
- Targets can specify dependencies - targets that should run before them
  (resolved recursively). Crash if dependency is not scheduled for
  execution.
- Targets can specify soft-dependencies - targets that should precede
  them if they exist. Will not crash if dependency is not schecudled for
  execution.