Performs static type checking, enables dynamic type checks.
function F(type, term) {
  let original = term;
  if (term && !term.__meta) {
    term = type.wrap ? type.wrap(term) : term;
    term.__meta = {};
    term.__name = function(name) {
      term.__meta.name = name;
      return term;
    };
    term.__desc = function(desc) {
      term.__meta.desc = desc;
      return term;
    };
    if (term.__meta) {
      term.__meta.term = original;
      term.__meta.name = "anon";
      term.__meta.desc = "no description";
    };
  };
  F.check(type, term);
  return term;
}