shell: add shell stack capability

Sometimes it is useful to temporarily push the active shell to the
background and preform a small task in another shell. It is especially
useful for small utility functions.

Unfortunately such helper functions if they wish to be reusable between
testcases needs to be agnostic about the name of the active shell when
it is called. The ability to push and pop shells solves this problem!
Merge pull request #11 from neg/shellstack

shell: add shell stack capability
execute: increase timeout in start

You might have such a slow connection to your target that a set timeout
of 1 second before we fail the start is very dangerous. Increase the
timeout to 10 seconds.

Observed in the wild over ssh connection with lots of starts generating
lots of output in a tight loop. Would be worse on slower serial
connections.
Merge pull request #12 from neg/timeout

execute: increase timeout in start
Don't set int::config in int::parse_config

This was a bug. Reading more configurations than one would overwrite
int::config.
Don't utilize int:: namespace in int::parse_config

int::parse_config are called very early during init, where the int
namespace isn't yet fully populated. Perhaps this should be indicated
more clearly by moving int::parse_config out of config.tcl and into
init.tcl. I will leave decision that for the future.
Remove get_full_path and use file normalize

We do not need a complicated procedure for this as "file normalize" does
what we want (resolves relative links and aliases like ~).
Add int::root_path to reflect the root directory
Add running config 9pm.rc

A running config for 9pm. Currently containing SSH_OPTS which is passed
to ssh. The user can override the default configuration located in
etc/9pm.rc with its own placed in ~/.9pm.rc which has precedence.
Make closing illegal shell fatal

And remove a dead return that could never hit.
Change debug level of missing configuration data

Change from DEBUG to DEBUG2. Not that this is really frame work related
but more that it clutters the logs and doesn't add much value for "normal"
debugging.
Add command completion matching using expect_after

Use expect after to add an implicit expect block for matching the end
return code for any started command. This means the user can expect for
what ever they want and after there expect cases are tested an implicit
case will be executed, checking for command completion.

By design, the user still has to call finish to harness the return code
and remove the checksum from the expect buffer. I felt this makes more
sense when reading the code, and would flow more naturally when mixing
custom blocks, no blocks, and capture calls.
Add rudimentary scp utility

Get or send files using scp. Supports multiple files in both directions
and utilizes send/finish with expect_after to know when transfer is
complete.

Examples:

Send /tmp/foo from current machine to /opt on "lightcycle"
$ scp "to" "lightcycle" "/tmp/foo" "/opt/"

Get /tmp/foo from "lightcycle" and store in /opt
$ scp "from" "lightcycle" "/tmp/foo" "/opt/"

Send /tmp/foo and /tmp/bar from current machine to /opt on "lightcycle"
$ scp "to" "lightcycle" [list /tmp/foo /tmp/bar] "/opt/"

Get /tmp/foo and /tmp/bar from "lightcycle" and store them in /opt
$ scp "from" "lightcycle" [list "/tmp/bar" "/tmp/bar"] "/tmp/"

Get all files from /tmp/ on "lightcycle" and store in ~/tmp
$ scp "from" "lightcycle" "/tmp/*" "~/tmp/" "-r"

Send all files from /tmp/ to ~/tmp on "lightcyle"
$ scp "from" "lightcycle" "/tmp/*" "tmp/" "-r"