thunk is a function that encapsulates synchronous or asynchronous code inside.
thunk accepts only one callback function as an arguments, which is a CPS function.
thunk returns another thunk function after being called, for chaining operations.
thunk passes the results into a callback function after being excuted.
If the return value of callback is a thunk function, then it will be executed first and its result will be sent to another thunk for excution, or it will be sent to another new thunk function as the value of the computation.