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.

This is not very intuitive. For most languages, adding is appending.

If the developer cares about the order of `start` and `first`, the second array should be  `['first', 'start', 'end', 'last']`.