cleaned up argument parsing

--help flag now displays defaults

input/output options now except src/dst and i/o

didn't need to convert argparse results to a dictionary
added generator utility code to wrap input stream

map_reduce_utils now implements a standardized way to iterate over key
value pairs in reducers.

reducer_stream() implements nested generators so that a generator is
returned for each set of key-value pairs with the same key.
removed recursive call that caused stack overflow

I added in a check in peek to ensure that there was a next element,
but checking that calls peek, so you get a stack overflow.
added tuple to dict converter for key/value pairs

Since the tokenizer returns nested tuples, when we access elements,
it's never very clear what element is being accessed since they are
indexed with numbers instead of strings.

KeyValueToDict is a class that allows us to convert these nested tuples
into dictionaries so that they can be indexed using strings, which
helps with readability in the reducers.
fix InputStreamWrappers termination function logic

finished_function of InputStreamWrapper should return true
when there are no more elements, not the other way around.
changed this in both the has_next method as well as in the
default parameter in the constructor.
implemented reducers using generator pattern

Moved all the reducers over to using the generator pattern in
map_reduce_utils instead of implementing iteration on their own. The
reducers also use the KeyValueToDict to parse key-value pairs now, as
opposed to simply indexing them with integers.

Added a precision argument to mapred_tfidf.py so that you can vary the
number of decimal places in the results.