Return 404 for invalid buckets

@maxfliri
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   backdrop/write/api.py
#	modified:   features/write_api/write_api.feature
#	modified:   tests/support/test_helpers.py
#	modified:   tests/write/test_flask_integration.py
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	backdrop/write/config/development_environment.py
Move side effect setup to main logic

@maxfliri
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   tests/write/test_flask_integration.py
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   backdrop/write/api.py
#	modified:   features/write_api/write_api.feature
#	modified:   tests/write/test_flask_integration.py
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	backdrop/write/config/development_environment.py
#	backdrop/write/flaskext.py
#	tests/write/test_flaskext.py
Validate bucket name using a converter

This also fixes the status code returned after POSTing to _status to be 405

@maxfliri
Rename flaskext as flaskutils and move it to core

@maxfliri
Merge pull request #101 from alphagov/refactor-routes

Refactor routes