fix(Request): Blank query string is always escaped

This patch avoids passing the query string through util.percent_unescape
when it is empty, in order to save a few microseconds when the client
does not submit any query parameters.
Adds an Exception Handler Mechanism

How to use:
    def handler(ex, req, resp, params):
        log_error(req, ex)
        resp.status = falcon.HTTP_500
        resp.body = "I regret to inform you that an unfortunate error has occured."

    app.add_error_handler(ValueError, handler)
Removes unneeded cruft from error handler tests
chore: Make travis run tests through tox the same way everyone else does

This gives us flake8 stuff and makes the Travis test more real-world.
Merge pull request #214 from kgriffs/travis

chore: Make travis run tests through tox the same way everyone else does
Merge pull request #211 from kgriffs/tuning

fix(Request): Blank query string is always escaped
Merge pull request #202 from sudorandom/exception_handler

feat(api): Adds an Exception Handler Mechanism
fix(README): HTTPUnauthorized and HTTPUnsupportedMediaType out of date

This patch updates the sample code that raises these exceptions,
to match the latest initializer signatures.
style: Rename 'e' to 'ex'

This patch makes some style rules explicit by listing them in
CONTRIBUTING.md and fixes one case in which the style rules were
violated.
feature(api): Error handlers may raise HTTPError

Error handlers may now raise instances of HTTPError and expect them
to be converted to a proper HTTP response, as they would be when
raised from within a regular resource responder or hook.

Also added examples to the README of using the error handler feature.
fix(HTTPUnauthorized): Move scheme into kwargs

This patch moves scheme from being it's own param into kwargs, to
discourage using it as a positional arg. This will avoid subtle
bugs in the future that may arise as the signature for the
HTTPError constructor changes over time.

BREAKING CHANGE: The 'scheme' argument to HTTPUnauthorized can no
    longer be passed positionally; it must be a named argument.
doc(README): Update to reflect change to HTTPUnauthorized scheme param
feat(api): add_sink method

This patch adds a new method, add_sink(...), to the falcon.API class.

EXAMPLES
========

Any requested URI path requested that starts with '/my-proxy' will be
passed to my_proxy, regardless of HTTP verb.

    app.add_sink(my_proxy, prefix='/my-proxy')

Any URI path requested that doesn't match a route will be
passed to my_proxy, regardless of HTTP verb.

    app.add_sink(my_proxy)

In the case of a collision between a route and a sync, the route
always wins.

    app.add_route('/books', book_collection)
    app.add_sink(book_worm, '/books')

The prefix may either be a regex string or a precompiled regex object:

    app.add_sink(my_proxy, prefix=r'/my-proxy/\d+')
    app.add_sink(my_thingy, prefix=re.compile('/thingy/[a-zA-Z]+'))
fix(tests): Use assertEqual instead of the deprecated assertEquals method
test(Request): Verify that query param list values are decoded corectly
fix(testing): Encode environ path to str in Python 2
test: Enable pylint testing
chore: Move tests out of falcon module
fix(Response): NOOP lambda in header property setter
fix(Response): Headers are case-sensitive

Web developers tend to think of headers being case-insensitive. However,
if you try to set the same header twice, with differently-cased header
names, Falcon treated them as separate headers.

This patch changes falcon.Request such that it now normalizes header
names internally, and when performing lookups.

Applications shouldn't break due to this change unless they were
accessing the private req._headers attribute directly.

Closes #185