On redis key update, also set a key with time

When updating the value of a redis entry with key <name>
also update a key <name>:last_update_time with the current time
Write full path name of config file to redis

Not just the relative path passed to python
Changes to facilitate non-blocking snapshot reads

1. Change get_spectra method to manually arm all
fft output snapshots and then read them all together.
Rather than arming and reading each one in serial.

2. Add new AMIDC method all_fengs_multithread,
which will run a method on all fengines with each
in a separate thread.

3. Change Engine class to have it's own FpgaClient instance,
rather than sharing instances between engines on the same board.
This has been half-heartedly implemented -- you still construct
an Engine instance with an FpgaClient object as one of the __init__
arguments, however __init__ now just gets the hostname of a roach
from this instance, then builds a new FpgaClient object for
it's own use. This solves some funny problems which seem to occur
if you multithread commands into the same FpgaClient instance.
E.g., sometimes a write to a register receives the readback value
from a different thread's write, and panics.

4. Add a 'num' attribute to Engine instances, so that when putting
multiple engine methods into a multithreaded queue, you can
figure out which response belongs to which engine, even if they don't
enter the queue in order
Change fft_auto_acc_len to ~1s

to match the main correlator accumulation time
Add monitoring script.

This script reads fengine data and writes to redis continuously.
Currently it just measures FFT powers