Implement symbolic constants

Symbolic constants like icmp-echoreply et al are not currently supported, and should be implemented.

Note that there are two kinds of symbolic constant, AIUI: symbolic constants in arithmetic expressions, where they just evaluate to a value, and symbolic constants in logical operators, e.g. port http.  Perhaps symbolic constants are only valid in some operators (like "port").  Some investigation is needed.
a bare lexer.next() call is kinda sketchy; can you make split_range advance the lexer if needed?  actually can you just fold split_range into parse_portrange; its name makes it sound like it's a general thing, but it's actually quite specific.