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.
`include?`, `has_key?`, and `key?` are all aliases. Do you think `key?` reads best? If so, should we define the `key?` method, rather than the `include?` method? (I'd rather define only one, this class doesn't need to have every method defined on `Hash`)