What is the difference between asynchronous and non-blocking calls? Also between blocking and synchronous calls (better examples please)?