traces dict values should be dictionary instead of tuple
Currently the Budget.calc_trace() method, which is the primary method that returns all noise traces for a budget, returns a dictionary keyed by noise trace names, with values that are tuples of the data and suggested trace style, with the exception that the value for sub-budgets is itself another budget dictionary trace. This is somewhat awkward to work with, since the caller has to inspect the return type to know how to handle it.
I suggest we change this to return values as dicts, with data and style keys, and an optional budget or sub-budget key for traces that include sub-budgets. I think it would make it much easier to work with, since for the basic case you could just do:
for name, attrs in traces.items():
plot(attrs['data'], **attrs['style'])
Then for the sub-budgets:
for name, attrs in traces.items():
if 'budget' in attrs:
...
The only drawback from this change that I can see is that the traces dict would not be mirrored directly by the hdf5 save format. But as long as we have the load_hdf5() function to handle the conversion it shouldn't be a big deal.