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 
Trying to enforce consistency in the API. Right now, it's nearly impossible to determine where some of these magical methods come from when building a software definition.