So, I knocked this up in notepad, so caveat emptor, but:

```
var paramsNodeName = name + '__params'
this.add(paramsNodeName, function () {
  var deferred = Q.defer()
  return deferred.promise
})

var syncNodeName = name + '__sync'
var syncNode = this.add(syncNodeName, function() {
  var syncArgs = arguments.slice(0)
  
  // Final argument will be the params resolved from the paramsNode promise, which came from the lazyNode inner function arguments.
  var ___params = syncArgs.pop()
  return fn.apply(fn, syncArgs.concat(___params))
}, args.concat(['___params'])
  
var evalNodeName = name + '__eval'
var evalNode = this.add(evalNodeName, function (d, result) {
    d.resultDefer.resolve(result)
    return result
  }, args)
  .builds('!' + blockNodeName)
  .builds(deferNodeName)
  .builds('?paramsNodeName')
  .builds(syncNodeName)
    .using('args.*', {___params: 'paramsNodeName'})

var lazyNode = this.add(name, function (d, params) {
  return function () {
    params.resolve(arguments.slice(0))
    d.blockingDefer.resolve()
  }
})
.builds(deferNodeName)
.builds(paramsNodeName)
```