rework Run/Attach interface

* stdin/stdout/stderr are done via io.Readers/io.WriteClosers, rather than
  everything going over one channel
* Env is now a simple []string, just to be a bit more like exec.Cmd, which
  also tries to be a OS-agnostic interface, despite K=V being 'Unixy'
* the attach/run API calls are now hijacked HTTP connections, so that stdin
  may be sent across the wire later
* rather than consuming the full stream until a payload with an ExitStatus is
  detected, the caller can call process.Wait() to block until it exits, which
  will return you its exit status.
* an 'error' field has been added to ProcessPayload to signify .Wait() failing
  server-side. this will bubble up to the client, which will return an error
  on its respective .Wait().
client sends stdin payloads over the connection
server passes stdin payloads to backend

closes the stream when a Stdin payload is received with no data