Notion of Threaded vs. Evented

  Threaded: Dedicate one thread to each request, and that thread does all the processing for the request until a response is sent. Any I/O, such as a call to a remote service, is typically synchronous, which means the thread will become blocked and sit around idle until the I/O completes

  Evented: Normally a single thread per CPU core. The idea is to ensure that these scarce threads are never blocked: all I/O is asynchronous, so instead of waiting, the thread can process other requests, and only come back to the current one when the response from the I/O call is ready.

  Key Differences
   - Threaded requires managing sets of thread pools.
    - Thread pools are used for obtaining parallelism.
   - Evented code should scale better
    - "execute this code later" is a core concept that will feel natural and consistent

Transformations
  - map & flatmap are used to transform containers from one type to another
   - Those containers can be a list (a container for a set of values), or a future (a container for a future result)
   - Example transformations on those contains are
       	List("Jim", "Dean", "Kunal").map(e => e.toLowerCase)
        future { "Jim" }.map(r => r.toLowerCase)