ENH: parallel context

Currently don't have support for mapping yet, but we can submit system calls or function calls now via IPython. The latter may require state updates on the engines, which is feasible from the current context. It is likely that mapping will go in relatively easily. 

From the shell:

```bash
$ echo -e "profile\tdefault" >> ~/.qiime_config
$ echo -e "n_engines\t2" >> ~/.qiime_config
$ parallel start
```

From within Python:

```python
>>> from qiime.parallel.context import context
>>> context.submit_sync('hostname')
('rl1-1-220-221-dhcp.int.colorado.edu\n', '', 0)
>>> def foo():
...     return "bar"
...

>>> context.submit_sync(foo)
'bar'
>>> def foo(a):
...     return a**2
...
>>> res = context.submit_async(foo, 5)
>>> res.result
25
```

From the shell:

```bash
$ parallel stop
```
Close, but not exactly. I'm interested on receiving exactly `num_groups` groups. Example: I have the following list:
```
['f2', 'f1', 'f3', 'f4', 'p2', 'p1', 't1', 'not16S.1', 't2']
```
And I want 4 groups. Using your code I will receive:
```
[['f2', 'f1'], ['f3', 'f4'], ['p2', 'p1'], ['t1', 'not16S.1'], ['t2']]
```
While the correct answer is:
```
[['f2', 'f1'], ['f3', 'f4'], ['p2', 'p1'], ['t1', 'not16S.1', 't2']]
```
However, I agree that it was an overkill, and I change the code for:
```python
sample_id_groups = [sample_ids[idx:(idx+k)]
                    for idx in range(0, (num_groups - 1) * k, k)]
sample_id_groups.append(sample_ids[(num_groups - 1) * k:])
```