C code printer now underscores symbols that match reserved words.

This fixes issue #8190 for the C code printer. If the user has a symbol name
that matches a core reserved word in the C language it gets an underscore as a
prefix.
Added a codegen test to check functions with reserved words.
Moved the reserved words check into CodePrinter so all code printers can use it.
Added back the deference symbol printing.
Reworked Symbol printers to use super() methods and added test for dereferencing + reserved words.
Fixed conflict.
Fixed the mutable set issue.
Moved reserved_words declaration inside __init__.
Reserved words in code printers improved.

- Changed to a suffix for reserved words.
- Moved the suffix into the printer's settings.
- Added an option to error on use of reserved words.
Merge pull request #8200 from moorepants/c-reserved-words

Added reserved words functionality to CodePrinter.