Improve error handling and freeze several objects

@throw is implemented, so -throw- is only used for actual errors in code (such as invalid arguments), and @throw is used for problems in what is being parsed. Only parsingErrors from @throw are caught by @optional.
The prototype of parsing instances (with @require, @optional, @throw, etc.), makeParser, and each individual parser, are now all Object.freeze()ed.