Move compile-time log-level setup to configure.
Decouple logger from parsing code.
Preserve existing linker flags.
Towards an exception-less architecture.

This large commit is the first attempt to move away from exceptions by
introducing three new primitives:

  (1) error
  (2) trial<T>
  (3) result<T>

An error just wraps an STL string, the more interesting pieces are (2) and (3).

A trial represents a computation that can fail with an error message. The
semantics are very similar to std::optional, except that a disengaged trial
contains an error. That is, a trial<T> either contains a valid ("engaged")
instance of T or an instance of error.

A result behaves like trial<optional<T>> but offers an cleaner interface,
allowing to use it easily with tri-modal semantics: a result<T> can (i) have an
engaged instance of T, (ii) be empty, (iii) or contain an error.

These primitives facilitate programming without exception. Alas, there exist no
monads in C++ and the programmer has to manually inspect the outcome of trials
and results and dispatch the control flow. Hopefully we'll find a syntactically
cleaner way of using these primitives in the future.

Many thanks to Benjamin Hindman for inspiring me on this topic.