timing: Allocate all timing events dynamically
This paves the way for a Julia-side API that can create new events
on-the-fly without having to modify timing.h
The core of the change is to introduce two different structs:
- An "event" stores all of the statically-determined attributes of a
profiler event (typically, zone name and source location info)
- A "timing block" stores the dynamic information relevant to a
particular span/measurement in the timing run
Events and timing blocks have a one-to-many relationship. The intended
pattern for a Julia-side API is to construct an event once at parse-time
using `jl_timing_event_create` (since this is relatively expensive due
to profiler traffic and allocations) and then to create its own timing
block on-the-fly for each block entry/exit.
This also re-factors the API a bit to hopefully be more consistently
named