Thank you everyone for the advice. I've heard of the high-side N-channel driver chips, but I wanted to do this the 100% DIY way. I already had ~90% of the required parts in my storage drawers (everything except the FETs).
In hindsight, I probably should have used just N-channel FETs and a driver IC. The P-channel ones were a good deal more expensive for similar specs and using a high-side driver IC would have been much cheaper.
1. I am not a professional electrical engineer by any means, but I have designed a similar circuit in the past to power my brushless RC car. It worked flawlessly until it died in a wreck. I also plan on adding some very non-standard features, including as an integrated motor temperature probe and an on-board diagnostic system. It'll also be able to work with Hall sensor wires and phase wires wired willy-nilly.
2. This is not just an e-bike controller, but also a learning experience. Next time, I'll just but a cheap controller (the Teensy alone costs more than a Chinese controller) and add some really beefy external MOSFETs on a large heat sink.
3. I feel like 20 amps without a heat sink is accurate, but I will be adding a 100x10x35mm heat sink when it arrives. My motor can't handle more than 35 amps, so heatsinked it'll be just fine. There's also a thermistor for protection of the MOSFETs.
4. I used ESD protection while soldering the MOSFETs.
More lessons learned:
1. Put tape on the back of the MOSFETs to prevent accidentally soldering to them through the board. I did this and had to destructively remove one of them to fix the problem. Luckily I ordered a spare.
2. Use higher power resistors. I had to switch out a 100 ohm resistor for two 50 ohm ones in series because the 100 ohm one started smoking during testing.
3. Test, build, and test again. Incremental building saves many headaches down the road.
Here is a picture of my controller up to this point. I got a sensored RC motor running smoothly and the 128-step PWM gives super-fine control.