Use sets and custom objects instead of dictionaries and arrays
Massive cleanup & surgical patches to ensure memory gets cleaned properly despite some strong reference cycles. Basically, a FunViewController is expected to *never get reattached after it has been removed once*. This allows us to recurse down the view hierarchy and remove all runtime-attached event handlers which otherwise would cause strong retain cycles. This patch also adds cleanup methods to UIView subclasses and FunViewController subclasses as the one authoritive place to unregister e.g [Event off:self]