How to efficiently design MongoDB database for Uber-like application?
As you demonstrated in your question, there is a clear relational structure to your data. 


There are different objects (Users, Requests, and Messages), which all relate to each other, potentially in multiple ways.  
These objects have attributes (eg driver or passenger names) that would be referenced many times from other objects (Requests). This requires either data duplication or normalization (and thus joins)
The different objects are tightly coupled to each other, and your anticipated data access patterns reflect the need to query from multiple angles.


The title of this article is intentionally provocative, but there is a lot of good content: Why You Should Never Use MongoDB

In particular, the section "How MongoDB Stores Data" and the several sections after that discuss precisely the questions you ask regarding Normalization vs Denormalization, and issues with how to efficiently query your data.

Ultimately, you have one main question:


  What would be the best way to design a database here?


The answer is: Because your data is relational, don't use MongoDB. 

MongoDB may be the right solution for storing unstructured (or less structured) data related to your application, but for the specific data you mention, it is the wrong choice.