Fix type attribute errors

Fix AttributeErrors being raised because AWSProperty doesn't have `type` set.

- Print a nice error if an incorrect property is set on AWSProperty (which doesn't have a 'type').
- Not all AWSProperty instances must have properties (for example, Cloudfront's S3Object type). Only fall through to a dict with a 'Type' property if the current class has a 'type'.
Could you make this a little simpler by using getattr & the default?

getattr(self, 'type', self.__class__.__name__)