support for anonymous middlewares
clean up types

- Split out type declarations into separate class
- Use namespaced types instead of global types (via MooseX::Types)
- use declared types where possible, instead of quoted type names (i.e.
  isa => Str, instead of isa => 'Str')
- Allow "authentication" attribute to coerce from a JSON::is_bool()
  value (instead of expecting it to be a 1 or a 0 all the time)
make sure authentication default on method is lazy

if it's not marked lazy, the predicate has no value (as it's always set
at object creation time)