Use only keyword args in object initializers and add serializer

Keyword arguments are better when extending these classes
and manually creating them as they don't have a special
order. Also, using simple `new **hash` a hash can be
deserialized into an object.

The serializer implements #to_hash and .from_hash and a class macro
`serialize_on` which sets what accessors are used when serializing
with #to_hash.

The Blob's content is not included in this by default because
most VCS implementations wouldn't want to store the whole file content
in the object itself.