Add a `d` operator that rolls n dice of size x [parsimonious]

This doesn't illustrate a lot about parsers, but die-rollers are fun,
and of course it shows that functions in your defined language needn't
have a 1-1 mapping to functions in your host language.
Dead-simple grammar that can read natural numbers [ply]

PLY's design might not be at all obvious to you. Here's what's going on:
In Python, if the first statement in a function is a void string
declaration, that string is a "docstring," and is assigned to that
function's __doc__ attribute (see PEP-257). PLY introspects the module
in which it is invoked, looks for functions named t_foo (for tokenizing)
and p_foo (for parsing), and then inspects their __doc__ attributes to
extract rules from them.

It additionally looks for a variable called `tokens`, which provides it
with a starting point for finding the _foo functions.

In parser methods (p_foo), the `p` argument is an arrayish with one
element per element in the defined rule. So in our p_number function, p
consists of ['number', x] where x is the result of t_NUMBER.

Beyond the PLY wackiness, there isn't a lot to see here. Our very
primitive parser can take strings containing numbers and return their
numeric representation.