def run!(command, options = {})
      max_attempts = options[:max_attempts] || 1
      error_class  = options[:error_class] || StandardError
      silent       = options.key?(:silent) ? options[:silent] : false
      max_attempts.times do |attempt_number|
        result = run(command, options)
        if $?.success?
          return result
        end
        if attempt_number == max_attempts - 1
          raise error_class, "Command: '#{command}' failed unexpectedly:\n#{result}"
        else
          next if silent
          puts "Command: '#{command}' failed on attempt #{attempt_number + 1} of #{max_attempts}."
        end
      end
    end
run a shell command (deferring to #run), and raise an error if it fails
@param [String] command to be run
@return [String] result of #run
@option options [Error] :error_class Class of error to raise, defaults to Standard Error
@option options [Integer] :max_attempts Number of times to attempt command before raising