Add comprehensive error-checking capabilities

It does the following:
1. Check function arguments to make sure they are of the correct types.
2. Check whether you are trying to overwrite a chainable method, a
   chainable getter, a flag setter or an internal members, and if
   so, throws an error.
3. Rewrite the code to check in addAssertion() and addSimple() the
   assertion doesn't already exist, and in extendAssertion() and
   wrapAssertion() the assertion does already exist, because
   previous code tried to directly access the name, but accessing
   accessor properties triggers the evaluation of the assertions,
   and therefore causes unexpected results.
0.3.1