Attribute API 2

**NOTE:** This RFC is incomplete, the specification of the new feature is TBD.

This RFC describes a new attributes API to be added alongside the current one. The goals of this new API are:

* Separate desired and observed state.
* Structure the syntax in a way that "trainwreck" errors
  (`NoMethodError` for `[]` on `nil`) can be avoided.
* Structure the syntax in a way that attribute tracing can be
  implemented simply.
* Separate node-specific persistent storage from
  cookbook/role/environment attributes.
* Structure the syntax in a way that can be implemented efficiently.

This RFC is adapted from https://github.com/opscode/chef-rfc/pull/9 which is retracted.
@coderanger You're saying it is easier to read

```ruby
attr('first.second.third.fourth.a').set(1)
attr('first.second.third.fourth.b').set(2)
attr('first.second.third.c').set(3)
attr('first.second.third.d).set(4)
```

than

```ruby
defaults_for('first') do |first|
  first.defaults_for('second') do |second|
    second.defaults_for('third') do |third|
      third.defaults_for('fourth') do |fourth|
        fourth.set('a').to(1)
        fourth.set('b').to(2)
      end
      third.set('c').to(3)
      third.set('d').to(4)
    end
  end
end
```

right?

The two examples @danielsdeleo posted don't look different at all to me, but they don't have very deep nesting.  Its more logic switches.