much rewriting and improving, but it's still experimental. R=rsc CC=golang-dev https://golang.org/cl/875045