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.

We could (maybe) if we went and fixed scalaz first, the issue is we don't have a general way to safely bracket, so we need to expose `start`, and `end` so that downstream data types can define their own bracketing functions. For example in ivory would be able to define a bracketed `IvoryT`. I am pretty iffy about including the naive bracket below because it is pretty crap (really only does the right thing for `Id`.