Testing shell app

Create a test app that exposes a shell.  This may be useful for tests that need to perform a sequence of manipulations to a single ongoing job/container.

Along the way, add support for specifying a complete Job configuration to pkg/exec.
It would be nice to be able to punt on service name uniqueness and eschew covering all the unrelated complexity of discoverd... but I tried it, and it seems to come out even harder.  The code is easy; ignoring errors, just

```
hostClient, _ := cluster.DialHost(cmd.HostID)
job, _ := hostClient.GetJob(cmd.Job.ID)
```

The trouble is, those calls to get the job info back from the host are RPC themselves, and negotiate all the concurrency and locks on the far side that implies...  It seems from the host daemon logs that `pkg/exec.Cmd.Start()` returns without waiting for any acknowledgement that its job has actually started, so it's easy to end up asking the host about a job it doesn't yet recognize.  Is that's something we should consider improving in `pkg/exec`?

After that, there would also be a race between job startup and the service's socket opening, while the test attempts to dial it... which could be solved with retries, but is also already handily solved by using discoverd since the service only annouces itself to discoverd after its socket is open.  So it seems this might be the best way after all.