bundle2: call _pushbundle2extraparts a bit sooner

This is the first step of a refactoring that will ease the inclusion of new part
in the bundle2 push and includes more information (like phases) in this push

We need to move the function a bit sooner to be able to group the generation of
`b2x:check:heads` and `b2x:changegroup` part in an external function. We move it
sooner to preserve parts creation order bundle2 tests rely on. At the ends of this
refactoring the `_pushbundle2extraparts` will be replaced by another mechanism
anyway.

--HG--
extra : rebase_source : ad05f3dac9c792987a05f3df3f1210886296b1bc
bundle2-push: extract changegroup logic in its own function

We extract the creation of changegroup related parts into its own function.
This precludes the inclusion of more diverse data during the bundle2 push.

We use a closure to carry the logic that need to be perform when processing the
server reply.
bundle2: add a ``bundle20.nbparts`` property

This property can be used to know how much parts have been added to the bundle2.
This will be useful to check if any part have been generated for a push.
push: add a ``pushop.stepsdone`` attribute

This attribute will record what steps were performed during the bundle2 push.
This will control whenever the old way push must be performed or skipped. This
will ultimately be used by changegroup, phases, obsmarkers, bookmarks and any
other kind of data ones may want to exchange even when bundle2 support is
missing.
push: use `stepsdone` to control changegroup push through bundle10 or bundle20

We use the newly introduced `pushop.stepsdone` attribute to inform
older methods than changegroup have already been pushed using a newer
method.
bundle2-push: move changegroup push validation inside _pushb2ctx

When bundle2 push includes more than just changesets, we may have no
changegroup to push yet still have other data to push.

So we now try to performs a bundle2 push in all cases. The check for changegroup
inclusion is moved into the ``_pushb2ctx`` function in charge of creating the
changegroup part.

The bundle2 part is aborted if no actual payload part have been added to the
bundle2.
bundle2-push: introduce a list of part generating functions

Instead of explicitly calling a few function to generate part in the bundle, we
now have a list of all part generators. This should make it easier for
extensions to adds new part in the bundle.

This new way to extend the push deprecates the old `_pushbundle2extraparts` way.
bundle2-test: use the new way to extend push content

The only core user of the old way were tests. We update them.
bundle2-push: drop _pushbundle2extraparts

All core user are now using the new way. We drop the old way.