/// <summary>
 /// Creates the LockedResource.  Until you actually return it to the ultimate consumer in one of the <see cref="Lock()"/> or <see cref="SpinLock()"/>
 /// methods (which are annotated with <see cref="UsingMandatoryAttribute"/>, guaranteeing disposal) it is YOUR responsiblity to make sure
 /// that the item is disposed IN ANY PATH THAT DOES NOT RESULT IN THE USER GETTING THE LOCKED RESOURCE REQUESTED.  This include exceptions,
 /// short-circuited returns, etc.
 /// </summary>
 /// <param name="timeout">How long should be wait.  If null, wait forever</param>
 /// <param name="token">A cancellation token that can be used to cancel attempting to obtain the resource.</param>
 /// <returns>A locked vault mutable resource</returns>
 /// <exception cref="ArgumentOutOfRangeException"><paramref name="timeout"/> was not-null but was not positive</exception>
 /// <exception cref="TimeoutException">operation not completed in time (should be handled by user not by me or you ... except, see above, we need
 /// to dispose the resource ourselves if we've obtained it ... before rethrowing)</exception>
 /// <exception cref="OperationCanceledException">the operation was cancelled and the cancellation was received via <paramref name="token"/>.
 /// The user should handle this, not you or me (except, if we obtained the resource we need to dispose it before rethrowing).</exception>
 /// <exception cref="LockAlreadyHeldThreadException">The thread you are attempting to obtain a lock on has already obtained the lock.</exception>
 protected LockedMonVaultMutableResource <MutableResourceMonitorVault <T>, T> PerformLock(TimeSpan?timeout, CancellationToken token)
 {
     using (var ilr = ExecuteGetInternalLockedResource(timeout, token))
     {
         return(LockedMonVaultMutableResource <MutableResourceMonitorVault <T>, T> .CreateLockedResource(this, ilr.Release()));
     }
 }
 /// <summary>
 /// Try to obtain a locked resource using a simple Monitor.Enter with no timeout and no cancellation token support
 /// This method may deadlock
 /// </summary>
 /// <returns>A locked vault mutable resource</returns>
 /// <exception cref="LockAlreadyHeldThreadException">The thread you are attempting to obtain a lock on has already obtained the lock.</exception>
 protected LockedMonVaultMutableResource <MutableResourceMonitorVault <T>, T> PerformLockBlockForever()
 {
     using (var ilr = ExecuteGetInternalLockedResourceBlockForever())
     {
         return(LockedMonVaultMutableResource <MutableResourceMonitorVault <T>, T> .CreateLockedResource(this, ilr.Release()));
     }
 }