revset: added lazyset implementation to public revset

Performance Benchmarking:

$ time hg log -qr "first(public())"
...

real  0m1.184s
user  0m1.051s
sys 0m0.130s

$ time ./hg log -qr "first(public())"
...

real  0m0.548s
user  0m0.427s
sys 0m0.118s
revset: added lazyset implementation to checkstatus

This improves the performance of the revsets 'adds' 'modifies' and 'removes'

Performance benchmarking:

$ time hg log -qr "first(adds(README))"
0:9117c6561b0b

real  0m2.279s
user  0m2.222s
sys 0m0.053s

$ time ./hg log -qr "first(adds(README))"
0:9117c6561b0b

real  0m0.172s
user  0m0.131s
sys 0m0.041s

$ time hg log -qr "first(modifies(README))"
1:273ce12ad8f1

real  0m2.292s
user  0m2.227s
sys 0m0.061s

$ time ./hg log -qr "first(modifies(README))"
1:273ce12ad8f1

real  0m0.178s
user  0m0.130s
sys 0m0.038s

$ time hg log -qr "first(removes(README))"
2379:e90cff87f871

real  0m2.297s
user  0m2.235s
sys 0m0.058s

$ time ./hg log -qr "first(removes(README))"
2379:e90cff87f871

real  0m0.975s
user  0m0.797s
sys 0m0.056s
revset: added lazyset implementation to _matchfiles

Performance Benchmarking:

$ time hg log -qr "first(file(README))"
0:9117c6561b0b

real  0m2.234s
user  0m2.180s
sys 0m0.044s

$ time ./hg log -qr "first(file(README))"
0:9117c6561b0b

real  0m0.172s
user  0m0.129s
sys 0m0.042s
revset: added lazyset implementation to matching revset

Performance Benchmarking:

$ time hg log -qr "first(matching(0))"
0:9117c6561b0b

real  0m2.213s
user  0m2.149s
sys 0m0.055s

$ time ./hg log -qr "first(matching(0))"
0:9117c6561b0b

real  0m0.177s
user  0m0.137s
sys 0m0.038s
revset: added lazyset implementation to secret revset
revset: added lazyset implementation to contains revset
push: move `remoteheads` into the push object

The heads of the remote repository are used to detect race when pushing
changeset. We now store this information in `pushoperation` object  to allow
extraction of the changeset pushing part.
push: move changeset push logic in its own function

Now that every necessary information is held in the `pushoperation` object, we
can extract the logic pushing changeset  to it's own function.

This changeset is pure code movement only.
push: move `incoming` into the push object

The fact that there is some unknown changes on remote one of the result of
discovery. It is then used by some push validation logic.

We move it in the object to be able to extract the said logic.
push: move outgoing check logic in its own function

Now that every necessary information is held in the `pushoperation` object, we
can extract the part responsible of aborting the push to it's own function.

This changeset is mostly pure code movement. the exception is the fact this
function returns a value to decide if changeset bundle should be pushed.
push: move discovery in its own function

Now that every necessary information is held in the `pushoperation` object, we
can extract the discovery logic to it's own function.

This changeset is pure code movement only.
push: move `commonheads` into the push object

The phase synchronisation start by computing the new set of common head between
local and remote and then do the phase synchronisation on this set. This new
common set logic will eventually be used by the obsolescence markers exchange.
So we are going to split the long phase synchronisation in two.
push: extract new common set computation from phase synchronisation

Now that every necessary information is held in the `pushoperation` object, we
can extract the new common set computation to it's own function.

This changeset is pure code movement only.