Parse empty string arguments correctly.

When the parser encountered an empty string (e.g. `""`) it was matching the
`soft_string` or `hard_string` rule, but didn't include any named matches
(i.e. any `literal` characters) so it returned the whole matched string
instead.

After experimenting with various ways of matching the opening and closing
quotes, it ended up being a smaller and more understandable change to just
add a rule to explicitly match empty strings.

Fixes #139
Support commented lines.

Any line beginning with a # will be treated as a comment and ignored. A #
later in the line doesn't (yet) indicate a comment.