Replace API Workshop with client-side solution

This is the first version of #360. There are still a few things that can be cleaned up but I think it is good enough to ship. @nquinlan please take a look when you have a chance.