Move behavior of `read_attribute` to `AttributeSet`

Moved `Builder` to its own file, as it started looking very weird once I
added private methods to the `AttributeSet` class and the `Builder`
class started to grow.

Would like to refactor `fetch_value` to change to

```ruby
self[name].value(&block)
```

But that requires the attributes to know about their name, which they
currently do not.
I agree. My personal preference is `include?` for list like structures and `key?` for dictionary like structures. If the protocol must be valid for lists and dictionaries it's `include?`.