(PUP-1799) Clarify public/private portions of the Functions API

This tries to split up the function api into 3 parts: implementation of the
function system (dispatching, signatures, and function calling), public
function creation API, and private function creation API.

All of these APIs should be considered experimental and under active
development. However, we want them to be available and usable so that we can
get feedback.

The difference between the public creation API and the private creation API is
that the private one contains all of the injection hooks. Once that system
settles down and becomes used in the codebase we may open it up to public
consumption.

This also slims down some of the dispatch mechanisms so that there aren't as
many choices that users will have to make. It should still retain all of the
power that the larger API had.