I ran into the same problem as you. It's kind of dumb the only easy function to get the authors in WordPress poops out HTML or simply a comma delimited list of authors without useful further data.
I had to create this function to get data to make an authors drop-down list for a blog with very special requirements. This just returns the users and takes the args 'exclude_admin', 'hide_empty'. It also adds the number of posts as the 'posts' field, since I needed to look it up anyway to exclude users with zero posts. Sorry if the PHP is wonky in some way, but I haven't done any for 3 years and had to jump into PHP again for this project (not my choice).
I agree it would've been nice if WordPress had model-only code for getting the authors. They don't really seem to have separated the model data from view. But then, it's a historical problem with PHP not creating boundaries or encouraging programmers to organize their code into mvc.
/**
* To get list of authors with posts field added
* which contains the number of posts for that author
* boolean arg 'exclude_admin', 'hide_empty'
*/
function get_authors($args = '') {
global $wpdb;
$defaults = array(
'exclude_admin' => true
);
$r = wp_parse_args( $args, $defaults );
extract($r, EXTR_SKIP);
$return = '';
$ex_adm = ($exclude_admin ? "user_login <> 'admin' " : ' 1 = 1');
$hi_emp = ($hide_empty ? "postnum.posts > 0 " : ' 1 = 1');
$query = <<<EOS
SELECT $wpdb->users.*,
COALESCE(postnum.posts,0) as posts FROM $wpdb->users
LEFT JOIN
(SELECT post_author, count(post_author) as posts
FROM $wpdb->posts
WHERE post_type = 'post'
GROUP BY post_author) as postnum
ON $wpdb->users.ID = postnum.post_author
WHERE $ex_adm AND $hi_emp
ORDER BY display_name;
EOS;
$authors = $wpdb->get_results($query);
return $authors;
}
}