Introduce the new __libcpp_recursive_mutex_t which differentiates
between a recursive and non-recursive mutex. This is motivated by
windows, where a much lighter wait alternative exists for non-recursive
locks. On pthreads, the same lock type is available with a different
typename and no static initializer value.
Introduce an internal __libcpp_mutex_reference to provide an
implicitly move constructed with type-erasure to let the condition
variable handling get a type-erased discriminated-union which we can
handle appropriately.
This uses C++11 features but is limited to C++03.