Bugfix: interpolation needs to work with parslet slices

the parser actually produces parslet 'slices' rather than strings.
A parslet slice behaves like a string but doesn't have all of
the methods of string.

So, interpolate needs to #to_s the thing it receives to be able to
handle slices.

This test is to document that fact and catch any regressions.
engine_spec is an acceptance spec
Refactor: pass the flow and state to FlowPresenter

this is a step towards the snippet interpolator, which will need access
to the flow in order to load snippets.
Refactor conditional resolver to take state in constructor

Feels like all of the node presenters need the state, and we can now
pass it easily at constructor time which avoids passing it round
internally between methods in the presenters.
Refactor: Interpolator takes state in constructor
No longer need to pass state to node presenter calls
Initial snippet interpolator
Prevent ordinary interpolator interfering with snippets

This is so that we can chain the `Interpolator` and
`SnippetInterpolator` together
Allow nodes to have trailing whitespace

The parser was too strict and wouldn't parse something with excess
trailing newlines or whitespace
Snippet interpolator strips trailing newlines

from interpolated value. This seems a reasonable initial behaviour but
may need to be revisited. Possibly depends on whether the interpolation
is 'inline' or 'block level'.
Wire in snippet interpolator
Add acceptance spec covering snippet interpolation

this is a full pass through parsing and evaluation.
Extract SnippetSource from SnippetInterpolator

the SnippetSource fetches a snippet from the flow and
presents it to resolve conditionals and contained interpolations.