[runtime] Harden the profiler signal handlers against not fully attached threads and HP reentrancy.
[runtime] Changes mono_stack_walk_async_safe API to be truly async safe.

This is a very very tricky API, so we restrict the returned data to be what's really
possible under sig context.
[profiler] Fix statistical backtraces to work and collect as many frames as possible.

This is a jumbo commit that addresses multiple issues with statistical backtrace collection:

1) It's not possible to reliably collect MonoMethod* so we check that they exist before
serializing to the .mlpd file and retrieve in sync context.

2) It was reporting the generic instance MonoMethod* under gsharing. Those methods are
not reported to the profiler since they are never compiled. They would turn out as unknowns.

3) Collecting IL offsets from async context is currently impossible to be done safely, so it's
now disabled. The way we'll do it in the future is by serializing the sequence point table when
JIT'ing.

4) The way we used to collect frames in statistical ignored all frames until the first LMF, which
discards a lot of them under statistical mode. We now properly pass sigcontext and have it been consumed.
In the future we should simply use the callchain mode.
[profiler] Guard against null sbuff when serializing statistical data.
[runtime] Introduce new MonoThread API for signal multiplexing. It's a provisional API until we figure out more of how it's suposed to work.
[runtime] Remove the second signal used by profiling and now multiplex distribution and sampling with the same signal.