New lib.event methods: on, off, one, when

when returns promise