Code needed to inject dependencies into CRABClient

Ideally, testing involves both unittesting (doesn't touch external
services) and fuller testing (sometimes called integration testing).
This is a first step to allow testing with external services by
injecting "fake" classes that look and feel like external services
Update submit/status to support API

Changes made:
  * Submit will accept a config file passed in-memory (keeping API
    clients from having to serialize the configuration to a file to pass
    it to CRABClient)
  * Status
    * Hidden option (hidden from crab help) to disable all the status
      output commands.
    * Returns the dict the client gets back up to the caller

Depends on #4242 (Douglas Adams is doubly proud) and is thus branched
off of there