Weak Events in C# – How to Avoid Nasty Memory Leaks