Make TryGet reliable

I would expect TryGet to never fail and return "false" either when cache miss or exception happen. 
But it is not so. No exception is handled by TryGet.

This leads to "poisoned cache" situation. If I save in cache some value which throws an exception when deserializing, it will never be replaced by a good value in this client code (pseudocode):
if(!_cache.TryGet())
  _cache.Set(GetValueExpensive())

Instead much more heavier approach needs to be taken with wrapping TryGet into exception and handling it.
Unfortunately "poisoned cache" situation happens not very often and very likely won't be detected in QA cycle. As result it encourage writing a code which is not reliable.

Proposed patch mitigates the issue by wrapping Try* methods implementation into try-catch clause.