SSH API Implementation

This isn't yet rebased, nor is it mergeable, it's just up for review and comments.
We generally throw for individual invalid values...should we do the same here?

Also, the docs below should probably mention that each property is required.