[WIP] Add general purpose Attributes

* [x] Implementation
* [x] 100% test coverage
* [ ] Documentation

Fixes #100 
Supersedes #40
Fixes #84 
Unblocks #97
I believe you are correct.  I didn't quite grasp the implementation here the first time through, but it looks correct even in weird cases like:
```php
$bag = new AttributeBagContainer();
$commitBag = new AttributeBagNamespaced($bag, 'commit.');
$commitDetailBag = new AttributeBagNamespaced($commitBag, 'commit.');
// ...
```

I do believe that something like this could cause problems.  They aren't critical problems, but they do allow people to get around the namespacing:
```php
$bag = new AttributeBagContainer();
$bag->setAttribute('commit.sha', 'abc123');

$commitBag = new AttributeBagNamespaced($bag, 'commit.');
$commitBag->getAttribute('sha'); // 'abc123'
```