Streamlined a few things and added user-defined illegal characters to call sig

## Streamlined:

- testing for unicode strings in python2 environments with a helper function
- illegal character replacement by merging all illegal char sets and running a single for loop with the union vs nested redundant replacements

### Reason:
Readability and a bit of a speed up re: the replacement 

------------------------------------------------

## Added:
- ability for user to include a list of illegal chars in the call signature

### Reason:
I needed to get rid of spaces in the file names and I imagine that others may have special needs as well.  Rather than replicate your awesome work I figured a couple small changes would add flexibility without  **TOO** much mission creep (hopefully). 
Right, it makes sense to squash the sets of illegal characters. However, I think you forgot to filter them by `target_file_systems`.

So this should probably be something like this:

    for character in set.union(*(illegal_characters[file_system] for file_system in target_file_systems)):