destructively modify the interface of on()

now it takes 2 or 3 args and extra options as the last argument as
elements of dictionary
automatically run tests
when 3rd argument is not a dictionary, optparse recognizes it as default value
fix specs to change the destructive update
update key name of default value
fix a key name for default values
add spec for help message with a default value and fix the bug it shows
use unlet because it can't contain the different types
unlet parsed_arg because of type error
add tests for parsing options having default values