dsl: use Agents for mutable scope

This allows for getting rid of elements/pick ugliness.

Instead of trying to thread state in a poorly-simulated monadic way,
we use the time dimension: an Agent awaits pushes, then at the end of
do-block releases pushed values and gets killed. Such Agent is
encapsulated in a Core.Scope module.
cleaner readme example