Let's make changes to handling of @optional and @required keywords in protocols
similarly to how we handle @private, @protected, etc inside instance variables:
1) Add context like protocolDeclarationSection (similar to visibilitySection)
that has @optional or @required keyword followed by interface declarations.
Thus we can easily check if the given interface declaration is within @optional or @required section.
2) Use lexer tokens instead of hardcoded @required, @optional strings.