phase-list: expose zipmerge via a public API

Expose the implementation of phase zip-merge algorithm via a public API.

A part of https://github.com/strongloop/loopback/issues/895

/to @raymondfeng please review
/cc @ritch 
The order of `first` and `start` is defined when we are looking at the operation of adding (defining) new phases: new phases that don't have a defined order are added to the head of the phase list. If we implemented it the other way around, then users won't be able to insert anything before the first existing phase `initial`.

My concern is that the order of `first` and `start` is not defined when we look at the problem as a topological sort and I don't see an easy solution how to define this order, unless we start bringing back parts of my initial implementation, in which case it's probably better to simply drop toposort altogether.