API page: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21...
Currently says:
variables: Only used for #theme in render array: an array of variables, where the array keys are the names of the variables, and the array values are the default values if they are not given in the render array. Template implementations receive each array key as a variable in the template file (so they must be legal PHP/Twig variable names). Function implementations are passed the variables in a single $variables function argument.
Could really do to explain that the variable name you define here is the name without the #, so that you have this system:
Defined in hook_theme():
'book_navigation' => array('variables' => array('book_link' => NULL),
),
Use in a render array:
$build['book_navigation'] = array('#theme' => 'book_navigation','#book_link' => $node->book,