Make jl_cumulative_compile_time_ns global (and reentrant).
Now, multiple tasks (on the same or different Threads) can start and stop compilation
time measurement, without interrupting each other.
* Makes jl_cumulative_compile_time_ns into a global, atomic variable.
Instead of keeping per-task compilation time, this change keeps a
global counter of compilation time, protected with atomic mutations.
Fixes #41739
```julia
julia> include("./compilation-task-migration-17-example.jl")
start thread: 2
end thread: 2
5.185706 seconds (3.53 M allocations: 2.570 GiB, 7.34% gc time, 15.57% compilation time)
julia> include("./compilation-task-migration-17-example.jl")
start thread: 3
WARNING: replacing module M.
end thread: 1
4.110316 seconds (18.23 k allocations: 2.391 GiB, 5.67% gc time, 0.24% compilation time)
```
Compilation time measurement originally added in: https://github.com/JuliaLang/julia/pull/38885
Problems addressed:
- This fixes https://github.com/JuliaLang/julia/issues/41739, meaning it fixes compilation time reporting in 1.7 after task migration was enabled.
- It also fixes the race condition that existed previously, even on 1.6, where multiple Tasks on the thread measuring `@time` could break the measurement, as identified in (https://github.com/JuliaLang/julia/issues/41271#issuecomment-876564749).
- It fixes reentrant `@time` by making the `enable` flag a _counter,_ instead of a boolean.
- It fixes `@time` called from multiple threads by making that flag thread-safe (via atomics).