Base class updates

- Add an type method to base AMQP classes to return the proper data type of an attribute
- Change Basic.Properties to a slotted class
- Change Basic.Properties.attributes to Basic.Properties.attributes(), returning the list of slotted attributes
- Frame.__getitem__ will now raise a KeyError instead of None for an invalid attribute
- Instead of class level attributes with the same name as obj attributes, prefix class attributes for data types with an underscore
- Properties base shouldn't check to see if an attribute is set for contains
- Add an attributes class level function for Basic.Properties instead of having it as an attribute
- Add some specification tests