Major overhaul of the api.

Using block handles which are shared pointers under the hood to have tree like propagated ownership.
This does mean that cyclic pipes are no longer supported but these were a nightmare anyway.
Also removed ability for block to hold on to pipe data reference even after calling out.  With this
functionality the design would have been a lot more difficult and any threaded implementation would
have required many more additional locks.