add a feature of budget swapping to help create and test IFO variants
This requires !166 (merged) first,
This MR adds a new attribute, swap = {OldBudget: NewBudget, OldCalibration: NewCalibration, ...} to noise budgets
Swaps in Parent Budgets are propagated to children. This allows a top level budget to adjusted sub budgets. This is a feature that helps account for the use of list and dicts, as class attributes, to store sub-budget trees. Such attributes don't otherwise respect inheritance well.
This is not supposed to be a feature used in any major top-level budgets, but for users to create and test budget variants without having to re-construct an entire budget tree for every variant. It pairs well with the precomp changes of !165, though is an independent MR.
The main use would be to sub-class a top-level budget and apply a handful of swaps. Such as swapping out a ResidualGas budget or some other budget that does not rely on a precomp that can be swapped using the new precomp mechanism.