Type lifting: new implementation (version 2)

Type lifting (formerly known as type pushing) has been entirely rewritten and put in a separate class, `TypeLift`.

This implementation is based on [persistent trees](https://en.wikipedia.org/wiki/Persistent_data_structure) and use [tree zippers](http://mth.io/talks/zippers-and-comonads/) to navigate and update them.

To manipulate such persistent data structures, we use a functional programming library, [FunctionalJava](http://www.functionaljava.org/).

This implementation strongly relies on a complete index of multi-typed predicates. However, we notice that in some rare cases, the given index was not complete. For safety, this index is checked before lifting the types.

We also propose an alternative implementation of a `DatalogProgram`: `TreeBasedDatalogProgram`. In this new class, rules are stored in a predicate tree following the structure of the SPARQL query.

The former implementation has been removed from the `DatalogUnfolder`.