Attribute rework

This patch introduces this.attributes (which we alias to this.defaultAttrs) which improves attributes interaction with mixins and introduces some extra assertions to help developers.

It's all backwards compatible apart from one big change (which I think we need to be cautious about before merging):

If you pass any attributes into attachTo that the component has not declared then they are ignored.  Example:

```js
var F = flight.component(function() {
  this.defaultAttrs({
    thing: 1
  });
});

F.attachTo(elem, { thang: 1, thing: 10 });

// Old attrs
// { thang: 1, thing: 10 }

// After this change
// { thing: 10 }
```

I think this will be a breaking change for Twitter's code base. In might well be for others.  Thoughts?

UPDATE: I've completely separated out the old a new behaviour and new behavior.  If you define a component using this.defaultAttrs then you get old behaviour, if you use this.attributes you get new behaviour.  Now a non-breaking change.

Also, we might want to go to a read only attribute model while we are changing this.  Two approaches here:

1. Develop time check using getters so API uses this.attr as is does now.

2. Use a method:

this.attribute('thing') //=> returns value
this.$attribute('thing') //=> returns jQueried version of that value

This would allow us to do some interesting things because we could around this function in components to add behavior such as logging.