Allow arbitrary include/exclude logic

This is coming from a real-world scenario. We have a minimum requirement version for Safari, but some weird custom Android browser is identified as Safari version 0. We wanted to allow this specific browser, but were unable to do so. This PR is the solution. The other nice side effect of this change, is that the requirements array need not be traversed fully, if one of the requirements or blocks returns a boolean.

P.S. I also converted the specs to the new rspec syntax.