Correct the block matching, add parameter patterns

The block definitions have been moved to primitives, and now extend
AbstractPattern. Calling match on a block will run the block if the
pattern on the parameter matches, and produces a successful match
containing the result of the block.

Block parameters can now use arbitrary expressions in parameter
positions that implicitly creates a variable with an ignored name. Any
expression which does not start with an identifier or an underscore will
be parsed as a pattern, and requests can be handled by wrapping them in
parentheses.