snippet: add GbSnippetContext.

The goal of GbSnippetContext is to encapsulate all of the complexity
of chunk expansion. Including preventing circular loops from cross
dependent chunks.

It will also some day include support for executing snippet code such
as javascript/python/etc.

You can do neat things like "$1|upper" to take the value from tab-stop
1 and apply an upper transform on it.