Implement lazy cache fetching

Summary:
Lazy cache fetching is the name I give to the possibility to retrieve a target
from the cache even if all the sub-targets that are needed to generate it are
not up to date. The idea is that those sub-targets would be retrieved later if
we need them.

This changes the semantic of the build command.
Indeed, with normal build systems, when we build a set of targest, we expect all
the sub-targets that take part in the building to become up to date. With this
new approach, we can't expect that anymore.

We'll need to cleary specify that because of that, the user should put the list
of targets he expect to have built explicity.

Test Plan:
Create several branches with diffrerent versions of the code source.
Switch between branches and build. When you build, you should expect only the
root targets to be retrieved from cache. Now modify a single file so that the
root target is not found in cache and build again. The root target should not be
found in cache but all the other objects file should.

Reviewers: NicolasDP

Reviewed By: NicolasDP

Subscribers: adrienconrath

Maniphest Tasks: T41

Differential Revision: http://91.121.199.76/D62