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.
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
Codegen: refactoring of Result class, add name kwarg

1.  Result subclasses Variable so it has a name.  By default, name
    and result_var get the dummy "result_" symbol.  This was already
    the case for result_var.

2.  Add name and result_var kwargs: name defaults to None and
    result_var defaults to name.

3.  Result can work with Matrix class.  Result can take dimensions
    kwarg.  Maybe not allowed in C/Fortran but others languages might
    allow this.

4.  Document the difference between name and result_var.  Perhaps
    these could/should be refactored, but for now, document that they
    are usually the same thing.