Avoiding subtle C# locking errors in lazy-loading patterns