Rewrite peek to use the next iterator.

This made more sense when the current iterator was the next thing
pointed to, but doesn't make a lot of sense if I haven't already
advanced the iterator, which.. I haven't. So yeah.
Add function_info.hh

Covers basic info about function types, namely their arity, argument
types, whether they're member functions, variadic, and const-qualified
member functions.
Add support for range and value-based predicates.

advance_if/_while (_while calls _if now) can take predicates that
accept three sets of arguments:

  No arguments - predicate is simply called.
  1 argument   - predicate is passed the value the iterator points to.
  2 arguments  - predicate is passed the current and end iterators.

This helps a bit with the code, though it makes it uglier on the
implementation side for these functions since the call has to pass
through a forwarding function. The upside here is that the forwarding
function inadvertently guarantees predicates are const-correct-ish.