[WIP] Add general purpose Attributes

* [x] Implementation
* [x] 100% test coverage
* [ ] Documentation

Fixes #100 
Supersedes #40
Fixes #84 
Unblocks #97
adding a `$default = null` parameter to this method could be useful.  That would allow the user to override the value returned if the attribute doesn't exist.  Thoughts?