Snippet engine

This is an alpha version of parser discussed in #381.

It does pass some basic tests, but is by no means finished:
- it misses proper primary field determination
- it doesn't try combining field default values and transformations
- empty fields/mirrors result in `(&field NAME nil)` rather than `(&field NAME)`
- field names are left as strings
- almost no validation is done
- it may benefit better error position reporting

I'm afraid I won't have much time to hack on it in nearest future, so I figured I'd clean it up a bit and put it out as is.