Use formal protocols for table view delegates and data sources.
Use formal protocols for field editor delegates.

This involves a lot of casting and tricking the compiler because NSTextField actually implements NSTextViewDelegate methods:

- (NSArray *)textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index;
- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector;
- (BOOL)textView:(NSTextView *)textView shouldChangeTextInRange:(NSRange)affectedCharRange replacementString:(NSString *)replacementString;

and all of NSTextDelegate:

- (BOOL)textShouldBeginEditing:(NSText *)textObject;
- (BOOL)textShouldEndEditing:(NSText *)textObject;
- (void)textDidBeginEditing:(NSNotification *)notification;
- (void)textDidEndEditing:(NSNotification *)notification;
- (void)textDidChange:(NSNotification *)notification;

but doesn't declare either.

We declare NSTextViewDelegate on NJRValidatingField so the super call from NJRIntervalField doesn't trigger a warning, even though NJRValidatingField doesn't implement any of the protocol's methods.

Still, we shouldn't (and no longer do) depend on any of these methods being implemented in NSTextField.