To marinate the chicken: in a large bowl, whisk together the yogurt, lemon, spices, and salt. Add the chicken and toss to coat well. Let the chicken marinate for 30 minutes or overnight if you have the time (if not, a few minutes will be fine).
To make the sauce: in a high-speed blender, add the garlic and ginger and blend until roughly chopped. Add the onion and blend again until roughly chopped. Alternatively, you can roughly chop it all by hand.
In a large skillet over medium or medium-low heat, add 3 tablespoons butter. Once the butter is melted, add the onion mixture along with ½ teaspoon salt. Stir it to mix, then cook for 3-5 minutes or until softened and fragrant, stirring occasionally.
Reduce the heat to low, add the garam masala, coriander, and cumin and stir for 30 seconds to bloom the spices. Immediately add in the tomatoes, cashews, ½ cup water, and remaining ½ teaspoon salt. Break the tomatoes open with the back of your spoon or spatula to release the juices. Stir everything to combine, then cover with a lid and simmer over low or medium-low heat for 5 minutes.
Scoop the contents from the pan into a high-speed blender (I just use a measuring cup), then pour in the liquid, scraping out every last bit with a rubber spatula. Blend on high until smooth (make sure you allow the steam to escape).
To the same skillet over medium-high heat, add the remaining 1 tablespoon butter. Once melted and hot, add the tofu or chicken, spread it out into an even layer and cook for 2-3 minutes, then give the pan a stir and cook for another 2-3 minutes.
Turn the heat to low and pour the sauce into the pan (be careful of splatter if the pan is really hot). If the mixture looks too thick or is splattering way too much, stir in ¼-½ cup water. Scrape up anything stuck to the bottom of the pan, then cover with a lid and simmer gently over very low heat for 5 more minutes.
Serve over warm rice and top with cilantro and a drizzle of cream or coconut milk, if you’d like.