refactor URLShortener to handle all queue operations and URL extraction; providers just implement a synchronous translation function