A general Profiler data type, in the same style as Trace.

Needs to be rebased after topic/trace.

This is still pretty rudimentary, but I think it is probably ok to start with and we can add combinators as we go. 

The other useful thing to do would be add a constructor to support profiling to some standard metrics library.

This would be useful. To be clear, you mean if I had two keys, `a`, `b` and `x` then `x` nested in `a` is different than `x` nested in `b`?