Projection input/output function refactor

Projection input and output functions were not being handled properly; ``state_push`` and ``state_pop`` was not being called for any of these transfer functions. This PR implements two changes:

* Moves the definition of the ``input_fns`` parameter to the ``Projection`` level so it can be defined in the same place as ``output_fns``.
* Implements ``state_push`` and ``state_pop`` properly at the ``Projection`` level to correctly handle both types of transfer function.

All the training tests pass after making these modification and I don't foresee any other issues  e.g snapshots should work fine after this change. I've submitted this as a PR to make sure everyone is happy with these commits before touching components in ``topo.base``.

EDIT: As only a few lines have changed, I am happy to make these commits directly to master instead to avoid creating an additional PR commit.