Cope with ShellError at the top level

(and add some clarification on what we think we're doing)
First swather of replacing run_cmd. Also add shell()

Perform the first swathe of replacements of run_cmd, mostly with
run0. However, if we actually *want* a shell command (e.g., if
we're trying to do "cd xxx; something") then we need the new shell()
function.

Also, port over the env argument to all the new functions (I forgot it
and it is sometimes needed), and make _rationalise_cmd convert any
non-string items to strings - this means if we accidentally convert

  run_cmd("whatever %s"%label)

to

  run0(["whatever", label])

it should still work (instead of getting all confused when it tries
to instantiate the Popen class - which in fact would raise an exception
saying that all the items in the list should be strings:

  TypeError: execv() arg 2 must contain only strings

- correct, but not useful)