Dashboard: Accession IDs associate with Transfers again

refs #7442

Use os.path.join to add / to the end of SHARED_DIRECTORY_ROOT if needed
before replacing it with %sharedPath%.

SHARED_DIRECTORY_ROOT was updated to read the shared directory path from a
config file instead of being hardcoded in an earlier commit. The previous
hardcoded value was not / terminated, but the config file path is /
terminated.

When creating a new Transfer, a replace is done on the path to convert it
from absolute to relative to %sharedPath%. The replace always added / to
the end of SHARED_DIRECTORY_ROOT, which caused the replace to fail when
SHARED_DIRECTORY_ROOT was already / terminated.

This caused the MCPServer to create a duplicate Transfer (without an
accession ID) when it found the files on disk, as it could not find an
associated Transfer by path in the DB.
Dashboard API: PEP8 cleanup
Dashboard: Cleanup helper functions

Remove duplicate definition of transfer type directories and move to where
it is called. Only called one place, and unlikely to be used elsewhere, so
shouldn't be in helpers.
Dashboard API: Clean up HTTP responses
Dashboard API: Endpoint for all waiting units

refs #7374

Add an endpoint that returns every unit that is waiting for user input,
including the name of the microservice it is waiting at.
API: Return UUID when approving transfers

Return the transfer's UUID when getting unapproved transfers and when
approving transfers. This makes it easier to track after approval.
API: Add endpoints to get the status for SIPs & Transfers

refs #7371
API: Update how status returned
Dashboard: Define transfer type directories in one place