Implement JAlf's Type System

@etcinitd Here is a first implementation of the type system. Before merging, we should still do the following:

- [x] Create a lot of unit tests
- [x] Complete documentation
- [x] Implement proper type checking of `relation(...)` literal by checking/imposing their type to Tuple.
- [ ] Implement proper type checking in the various operators.
- [ ] Refactor `Relation#equals` to return false unless relations have same type.

In addition, there are a few design choices that are arguable. Among those:

- [x] Type inference is lazy on operators, instead of being immediately computed/passed at construction time. Passing the type at construction time is at least required to avoid recomputing the types everytime in AST rewriting. Edit: fixed as proposed.
- [x] Tuple supports not knowing it's type at all, and infers it when asked. This is mostly to avoid computing the tuple type in DSL's `tuple()` while the main scenario is embedding the tuple in a `relation(...)` call that would know its own type. It is then able to check/impose it to the tuples. Now, maybe that's premature optimization; relation literals are not that big in practice. Edit: fixed as proposed