std::function alternative with no dependencies
Self-assignment may be expensive, but it should be a no-op instead of UB. I suggest copy-and-swap.
Omitting move-semantics will most certainly cost you.
Your naming of the internal class suggests all callables are lambdas. Not true!
You cannot store any move-only callables. Admittedly std::function is also crippled in that respect. Just throw an exception if the non-copyable object needs to be copied.
If your function has return-type void, it should simply discard the callables return-value. You don't.
std::function throws an exception if empty when called. Using assert() is less than a pale imitation.
delete p; if p is a null pointer is a no-op. No need to double-check.
Conversion to bool should be explicit. Otherwise, conversion to any arithmetic type can happen.
As you said, yours is less efficient. That's especially the case when std::function benefits from mandatory small-object-optimization.
You don't use SFINAE when creating from a callable. That can be inconvenient.