added: join() code, tests; removed: callbacks -> chains