Use re sharper annotation attributes to improve ReSharper's analysis.

After a bit of going back and forth here, I added a support for JetBrains.Annotations.CanBeNullAttribute 
 wherever it can be used.

I also used PostSharp 4, since using the NuGet package which is published today (version 0.1.0) does not compile. This PR should fix that as well.

note that in order to use JetBrains.Annotations.CanBeNullAttribute (which is an optional alternative to AllowNullAttribute) it is required to set the compilation option, "JETBRAINS_ANNOTATIONS" otherwise, it will not be compiled in the produced dll, and PostSharp will not see it.