.NET observer design pattern implemented using events