BLOCKER: Issue 487

Note that this PR touches all code that deals with files and is ready for review.
Slight compaction and reduction in reuse and removes multiple calls to `split`. This does introduce an added call to `joiner`, but that could be removed through expansion of the list comp. Non-blocking, just a different way to approach this problem.

```python
barcode_files = (barcodes_str.split(','), [])
forward_read_files = (forward_reads_str.split(','), [])
reverse_read_files = (reverse_reads_str.split(',') if reverse_reads_str is not None else [], [])

for _, f in retrive_latest_data_directory("uploads", retrive_all=True):
    joiner = partial(join, f, str(study_id))
    for to_find, found in (barcode_files, forward_read_files, reverse_read_files):
        found.extend([joiner(file_to_find) for file_to_find in to_find if exists(joiner(file_to_find))])

barcodes = barcode_files[1]
forward_reads = forward_read_files[1]
reverse_reads = reverse_read_files[1]
```