function createPhase(name) {
            return {
                name,
                policies: new Set(),
                hasRun: false,
                hasAfterPolicies: false,
            };
        }
The goal of this method is to reliably order pipeline policies
based on their declared requirements when they were added.

Order is first determined by phase:

1. Serialize Phase
2. Policies not in a phase
3. Deserialize Phase
4. Retry Phase
5. Sign Phase

Within each phase, policies are executed in the order
they were added unless they were specified to execute
before/after other policies or after a particular phase.

To determine the final order, we will walk the policy list
in phase order multiple times until all dependencies are
satisfied.

`afterPolicies` are the set of policies that must be
executed before a given policy. This requirement is
considered satisfied when each of the listed policies
have been scheduled.

`beforePolicies` are the set of policies that must be
executed after a given policy. Since this dependency
can be expressed by converting it into a equivalent
`afterPolicies` declarations, they are normalized
into that form for simplicity.

An `afterPhase` dependency is considered satisfied when all
policies in that phase have scheduled.