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?

Or even `a` nested in `a`. Otherwise you can't time nested calls without an explicit offset/depth. I'm not sure if that's a problem with the way we do things in Ivory, but just something that might bite us (I guess?).