This patch changes `costAndCollectOperands` to use `InstructionCost` for
accumulated cost values, and introduces a new class `InstructionBudget`
to maintain a budget of those costs.
`InstructionBudget` is an abstraction for `InstructionCost` which hides some
of the complexities around InstructionCost's state.
`isHighCostExpansion` will return `true` if the cost is too high or invalid.