Update schema.py

This will allow for the underlying dictionary implementation to be configurable without changing the current/default behavior. For example:

```python
from collections import OrderedDict

from halogen import Schema, Link, Attr, Embedded

class MySchema(Schema):
    dict_type = OrderedDict

OrderedSchema = type('MyOrderedSchema', (BaseSchema,), OrderedDict([
    ('self', Link()),
    ('field', Attr()),
    ('sub', Embedded())
]))

OrderedSchema.serialize(obj)
```

This would allow someone to have predictable serialization results:

```json
{
    "_links": { ... },
    "field": "value",
    "_embedded": { ... }
}
```
avoid one letter variable names, use key=lambda attribute: attribute.creation_counter