B2 application key support  (lp:#1790248)

[Original report](https://bugs.launchpad.net/bugs/1790248) created by **Tobias Sachs (sachstobia)**
```
Hey!

B2 recently added support for separate application keys [1] just for one
bucket. If I use them I get the following error with 0.7.18:

Folgendes Archivverzeichnis wird benutzt:
/root/.cache/duplicity/f78e085eb292fbcdee4358116ce069f5
Folgender Sicherungsname wird benutzt: f78e085eb292fbcdee4358116ce069f5
GPG binary is gpg, version 2.1.18
Import von duplicity.backends.acdclibackend Succeeded
Import von duplicity.backends.azurebackend Succeeded
Import von duplicity.backends.b2backend Succeeded
Import von duplicity.backends.botobackend Succeeded
Import von duplicity.backends.cfbackend Succeeded
Import von duplicity.backends.dpbxbackend Failed: No module named dropbox
Import von duplicity.backends.gdocsbackend Succeeded
Import von duplicity.backends.giobackend Succeeded
Import von duplicity.backends.hsibackend Succeeded
Import von duplicity.backends.hubicbackend Succeeded
Import von duplicity.backends.imapbackend Succeeded
Import von duplicity.backends.lftpbackend Succeeded
Import von duplicity.backends.localbackend Succeeded
Import von duplicity.backends.mediafirebackend Succeeded
Import von duplicity.backends.megabackend Succeeded
Import von duplicity.backends.multibackend Succeeded
Import von duplicity.backends.ncftpbackend Succeeded
Import von duplicity.backends.onedrivebackend Succeeded
Import von duplicity.backends.par2backend Succeeded
Import von duplicity.backends.pydrivebackend Succeeded
Import von duplicity.backends.rsyncbackend Succeeded
Import von duplicity.backends.ssh_paramiko_backend Succeeded
Import von duplicity.backends.ssh_pexpect_backend Succeeded
Import von duplicity.backends.swiftbackend Succeeded
Import von duplicity.backends.sxbackend Succeeded
Import von duplicity.backends.tahoebackend Succeeded
Import von duplicity.backends.webdavbackend Succeeded
B2 Backend (path= backups/, bucket= XYZ, minimum_part_size= 100000000)
Bucket found
Hauptaufgabe: cleanup
Acquiring lockfile
/root/.cache/duplicity/f78e085eb292fbcdee4358116ce069f5/lockfile
================================================================================
duplicity 0.7.18 (August 21, 2018)
Args: /usr/local/bin/duplicity --verbosity debug cleanup --force --sign-key
XXX --encrypt-key XXX b2://XXX:XXX@XYZ/backups
Linux Pandora 4.9.0-5-amd64 #1 SMP Debian 4.9.65-3+deb9u2 (2018-01-04)
x86_64
/usr/bin/python2 2.7.13 (default, Nov 24 2017, 17:33:09)
[GCC 6.3.0 20170516]
================================================================================
Entfernte Metadaten werden zum lokalen Puffer synchronisiert …
duplicity-full-signatures.20180304T185359Z.sigtar.gpg wird zum lokalen
Puffer kopiert.
Temporäres Verzeichnis /tmp/duplicity-Gx_hpr-tempdir wird benutzt
(mktemp) temporäre Datei /tmp/duplicity-Gx_hpr-tempdir/mktemp-Sy_6xV-1 wird
registriert
Get: backups/duplicity-full-signatures.20180304T185359Z.sigtar.gpg ->
/tmp/duplicity-Gx_hpr-tempdir/mktemp-Sy_6xV-1
Rückverfolgung des vorangegangenen Fehlers: Traceback (innermost last):
  File "/usr/local/lib/python2.7/dist-packages/duplicity/backend.py", line
369, in inner_retry
    return fn(self, *args)
  File "/usr/local/lib/python2.7/dist-packages/duplicity/backend.py", line
552, in get
    self.backend._get(remote_filename, local_path)
  File "/usr/local/lib/python2.7/dist-
packages/duplicity/backends/b2backend.py", line 113, in _get
    b2.download_dest.DownloadDestLocalFile(local_path.name))
  File "/usr/local/lib/python2.7/dist-packages/logfury/v0_1/trace_call.py",
line 84, in wrapper
    return function(*wrapee_args, **wrapee_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/b2/bucket.py", line 168, in
download_file_by_name
    url, download_dest, progress_listener, range_
  File "/usr/local/lib/python2.7/dist-packages/logfury/v0_1/trace_call.py",
line 84, in wrapper
    return function(*wrapee_args, **wrapee_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/b2/transferer.py", line 45,
in download_file_from_url
    range_=range_,
  File "/usr/local/lib/python2.7/dist-packages/b2/session.py", line 39, in
wrapper
    return f(api_url, account_auth_token, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/b2/raw_api.py", line 248, in
download_file_from_url
    return self.b2_http.get_content(url, request_headers)
  File "/usr/local/lib/python2.7/dist-packages/b2/b2http.py", line 337, in
get_content
    response = _translate_and_retry(do_get, try_count, None)
  File "/usr/local/lib/python2.7/dist-packages/b2/b2http.py", line 119, in
_translate_and_retry
    return _translate_errors(fcn, post_params)
  File "/usr/local/lib/python2.7/dist-packages/b2/b2http.py", line 55, in
_translate_errors
    int(error['status']), error['code'], error['message'], post_params
 FileNotPresent: File not present:

Versuch 1 fehlgeschlagen. FileNotPresent: File not present:
^CSperrdatei
»/root/.cache/duplicity/f78e085eb292fbcdee4358116ce069f5/lockfile« wird
freigegeben
Bereits gemerkte temporäre Datei /tmp/duplicity-Gx_hpr-tempdir/mktemp-
Sy_6xV-1 wird entfernt
INT abgefangen … wird beendet.
Sperrdatei
»/root/.cache/duplicity/f78e085eb292fbcdee4358116ce069f5/lockfile« wird
freigegeben
Sperrdatei
»/root/.cache/duplicity/f78e085eb292fbcdee4358116ce069f5/lockfile« wird
freigegeben

Python 2.7.13 (default, Nov 24 2017, 17:33:09)
[GCC 6.3.0 20170516] on linux2

Distributor ID: Debian
Description:    Debian GNU/Linux 9.5 (stretch)
Release:        9.5
Codename:       stretch

#pip show b2
Name: b2
Version: 1.3.6


[1] https://www.backblaze.com/b2/docs/application_keys.html
```

Story points: 16.0