[WIP] Progress Tracker

As discussed in https://github.com/composer/composer/issues/2809

This WIP PR adds a `WorkTracker` set of classes which allow progress to be registered and subsequently evaluated by a work tracker formatter.

Currently progress is only tracked for the dependency resolution process (i.e. all the time that passes before it starts installing packages).

- [ ] Implement progress tracking for the rest of the installation process (?)
- [ ] Improve output formatters

NOTE: Please don't add any CS comments, I havn't reviewed the code myself yet.

## Work Trackers

Work trackers have the methods `complete` and `ping` (to register a progression) in addition to factory methods for creating *nested* work trackers. 

There are three work tracker classes. One is a contextual tracker, which is used to access the *current* tracker the other two are `BoundedWorktracker` for tracking progressions with a known number of steps and `UnboundedWorkTracker` for handling progressions of an undefined length.

Library classes that need to track their progress are always injected with the `ContextWorkTracker`.

## Output

The output is managed by a class implementing the `FormatterInterface`.

The output formatter that will be used is determined by the `--pretty` option.

Because the work trackers are nested it is possible to produce hierchical output.

````
$ ./bin/composer install --pretty=multi                                                                                                             ⏎
[5/5] Installing dependencies (including require-dev)                                                             
[81/160] Getting rules for "70" jobs with "80" installed packages                                                 
[1/-] Add rules for package symfony/yaml
````

There is also a verbose debug formatter:

````
$ ./bin/composer install --pretty=debug | less                                                                                                                 ⏎
  BEGIN: Dispatching pre update event
  DONE: Dispatching pre update event
  BEGIN: Adding repsoitories
  PING: [#000001] [2.0231s] Adding repsoitories
  DONE: Adding repsoitories
  BEGIN: Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000001] [0.0002s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000002] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000003] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000004] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000005] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000006] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000007] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000008] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000009] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000010] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000011] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000012] [0.0001s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000013] [0.0000s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  PING: [#000014] [0.0000s] Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  DONE: Removing unstable packages from the local repository (if they don't match the current stablitity settings)
  BEGIN: Installing dependencies (including require-dev)
  PING: [#000001] [0.0001s] Installing dependencies (including require-dev)
  PING: [#000002] [0.0000s] Installing dependencies (including require-dev)
  PING: [#000003] [0.0000s] Installing dependencies (including require-dev)
  PING: [#000004] [0.0000s] Installing dependencies (including require-dev)
  PING: [#000005] [0.0000s] Installing dependencies (including require-dev)
  DONE: Installing dependencies (including require-dev)
Solving dependencies
  BEGIN: Getting rules for "70" jobs with "80" installed packages
    BEGIN: Whitelist from package
...
````
Sorry, this is just junk from a previous iteration, as said in the description this is a WIP, but I should have reviewed this code.