Unmanaged write barriers functions are protected by a lock.

Unmanaged code that needs to perform a store, does so by calling the
write barrier functions from sgen, which are protected from interruptions.
Added checking for critical regions for sgen threads.

A mono thread is considered to be in a critical region also if it is a sgen thread
that is in a critical region internal to sgen.
IL code uses storing write barriers now.

These write barriers are protected from interruptions.

Native write barriers are temporarily disabled since they aren't storing.
The nostoring write barrier is no longer exposed to code outside the GC. Only storing write barriers should be used.
Native storing write barrier for the x86 architecture.

This new write barrier consists in a call to a statically generated block of code.
Native write barriers are protected from interruptions.
Native storing write barrier for the amd64 architecture.
Native storing write barrier for the ARM architecture.