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.
Print Limit arrows with unicode

fixes #5255
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.
Watch for nan in the f.is_Add branch of eval_sum_symbolic

fixes #8251
Merge pull request #8200 from moorepants/c-reserved-words

Added reserved words functionality to CodePrinter.
do not re-evalf Numbers during comparisons
FCodegen: add matrix tests
FCodeGen: add MatrixSlice tests, including XFAIL one
CCodegen: add Matrix tests
Codegen: refactor Routine class, add friendly "make_routine"

Put the existing Fortran/C `Routine.__init__` into Codegen class.
Essentially unchanged.  Codegen will now make appropriate instances
of Routine.  Routine is still essentially language agnostic, although
a particular instance might be more appropriate for a particular
Codegen.
Codegen: update tests to use "make_routine" instead of Routine directly
Codegen: redo docstrings, slightly simplify Argument classes

Lines to 75 chars, follow numpy style.  Some pylint fixes.
Slightly simplify Argument and its subclasses.
Codegen: do input checking in the Routine class