fix(lua): replace std::mutex with std::recursive_mutex, add test that demonstrates the problem that is being fixed

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
feat(util/shared_mutex): add support for recursive lock at shared_mutex

We need support for recursive locks. The main user of this class is
the environment object. This commit adds a test that demonstrates that
the shared_lock of the environment object may be recursively requested.
Before this fix, the Lean was deadlocking in this example.

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
feat(util/shared_mutex): add support for recursive lock at shared_mutex