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.
Cool. WDYT about me changing this method to `key?` as a separate PR since I have two others dependent on this which will require additional rebasing if I do it here? (Sorry)