Make read-blob more flexible, and write-blob more stable

- read-blob can now send the blob data InputStream to another function for
  custom processing
- the 'git' argument of write-blob is now optional
- write-blob always closes stdin after copying the data and before checking for
  error, even if an exception occurred while copying
Update hesobase docstring to indicate repo-root is not stored

The repo root is not stored in the repository, because other peers need not know
it.
Add an extra unit test for git/add-blob

Adds two blobs in sequence to an empty tree.
Add dependency on clojure/data.codec for conversion to/from base64

This will be used for converting public keys to/from strings when the user
handles them. The keys should be in a form that is copy+pasteable and able to
enter into a shell or REPL.
Make the key-pairs generated by hesokuri.ssh 2048 bits long

This is what appears to be the default on the systems I have access to when
generating a key-pair with ssh-keygen.
In add-peer, add a blob for the port in addition to the key
Logic to convert RSA keys to and from base64 Strings
Move key coersion utility functions to hesokuri.ssh

Also add unit tests for them.
Fix reference to hesokuri.ssh/public-key function from repl.clj
Add hesokuri.git/get-entry for finding things in a loaded tree
Add git/author and git/commit functions for creating commit data
Clean up how we refer to IO utility functions in hesokuri.git(-test)
Make hesokuri.util/write-bytes coerce the argument to a String
Add write-commit function

This function supports writing commit trees and parents using the plain hash
(as supported by write-commit-entry), or the expanded data, as returned by
read-tree or read-commit.
Make read-commit lazily recursive

It reads items recursively in the same style as read-tree reads nested trees
recursively.