fix(debug): print type in lean_assert, print bool correctly

 - use typeinfo to print out a type of value when an assertion fails.
   need to use "c++filt --types" to demangle names for non-basic types.
 - use std::boolalpha and std::noboolalpha to control the printed values
   for "true" and "false"
chore(travis): use c++filt to handle demangled c++ names
feat(lazy_list): implement ML-like lazy lists

We will use lazy lists to represent the set of solutions produced by the elaborator. The elaborator plugins will also use lazy lists.

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
chore(travis): do not use c++filt on Linux builds

There is a bug in c++filt on Linux. For instance,

    c++filt -t 355687428096000

causes a segmentation fault.