rework execute_command to use subprocess.Popen instead of os.popen

also execute_command can now take the command argument as either a
list or a string.
pass commands/arguments on as an array instead of a string

this allows commands such as

git multi commit -m "update copyright notices to 2014"

to properly pass their arguments through to the multiple invocations
of git