Definitely impressed if this is your first crypto work. I really like the simplicity, reminds me of OpenSSH.
I gotta agree with some of the naysayers though - this needs more time to brew. Even if it's perfect, there still more proof to show.
My suggestions:
* A long-running interoperability test between your lib and another. Test vectors don't catch everything. Run it for a week, check results and publish the results.
* Fuzzing. You need to to catch false results, random crashes, stack overflows, etc. Fuzz every input, do it for random lengths (both underflow and overflow).
* Maybe port it and test on Win, Mac, ARM, MIPS. I find a lot of bugs shake out during ports.
* Timing. You can't prevent all side-channel attacks, but bits going out are easy attack vectors. Use a high-precision timing mechanism to catch any unusual spikes. Capture a few hours of points for each functional path, and publish the results. (crypto_aead_unlock has two return paths, it might be better to maintain timing).
* Personal preferences: Rather than using int returns, use bool. Zero your ctx vars, e.g. a_ctx ctx = {0,};
I spend more time in testing products than development, honestly. Publish as much relevant data as you can.