Add a Cleanroom object for evaluating DSLs

This PR is a result of a 5-hour plane ride.

- Evaluate DSLs in a cleanroom. This prevents unintentional (or intentional) modification of things inside a project/software. It also implicitly declares a DSL API.
- Declare a public API in project and software
- Remove methods that don't do anything or just add indirection
- Do what a bunch of `@todo` comments said to do

/cc @opscode/release-engineers @opscode/client-eng 
Removing the delegation here makes packagers behavior dependent on a lot more inputs. Previously, a packager's behavior would be dependent _only_ on data from public methods on project.